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
QcpIdu_!LqqZx;B!052%u*Z=?k
literal 0
HcmV?d00001
diff --git a/pictures/ribbon-producer.png b/pictures/ribbon-producer.png
new file mode 100644
index 0000000000000000000000000000000000000000..b46fda6d590979b0a9d8235d034c9bcb6516ae28
GIT binary patch
literal 7497
zcmb7pXIvBAyKMqU2Z_?VAU*UJ=_OJ`>AeVqCP?pyKtQP>C{;naAXSkdNRdvEj&u=$
zP^CBN^^U&x{NHo$hx5Dl!({f9J$q*F=ULBME3vxT>J+4mq#zK8LQ?~-4+4R;fc6D3
zA@D0{V59=+JwCaCi2!_3?GEq8pe7
zftY7B;mU@AnVZugu1vo|h<3IG-CesYV$W}UMKAo|ZZFUygs+Qvy9wH(MTeuxKn51B
zssz;6?&O-xfIpt(RRb&NqvQ;m|i?1>Ve2DJ<%-
z3#WJe=f4}fer>#HrJGJv-@CKcCA-(e)`AQa9+baPn3EGc_d9iqHB^fb0vX%qaSTAl
z6tjFZy#XPysl3f`<73+f<>-*kcUh6#(L($ZqgMv$R
z@mdDtk8A@`^P(f@BV0Gpp0zPG=A1Cly(3cDY@kAz_8us(CGr<5)pnf!*^l0UtswfV
z!(4yG*kVa?HnR^uhfMh6Cv^IYAI{deCojiT`K75LPTq)?RUWmv%lVXld?N0-c=B1q
z+c@Iqw<3GS!lQ{CgeXTMFr<;E3?mtLzvhdJ)u
zvu=tfm)FjlbYG^N8J54QnCrNMtL#Tu@oioGs3Zdw#4Q0|Gcw5Q|9$lRqz;D*`rS0n
zc`QbM0-f1EU3@Lg*|fVO%wvYlqzu=a)8x?QH9oZuzpxDnv*t+lM&Y!Q8=|I4PU(35~yYr~B
zz`2vPfFv$wuxdNQmv`p%zWoL=XQE9Z$12YK-O}QLbC#2raR(JFp+(*ozkkC@{4CK+
zaC@QdwJJ*IkO*}?Acm(C3-^Zd=KC2rIOL&Mx-x7+JRAa#dSA%ifK+EJsiE90-ly
zmb>tpyQb3`tI?dmo0b~T7#kCh9r5Jg04G6v)0&vH;r7><&HgLHS`eD>+emCujE0iB
zoJ_&jUiF!B)0)R;QgVww+*CYbimg2DNpKzK&V9_iucs+EFd|cEXj%HzK6F`8-oo!<
zA^6D9N*$gxxX0OBQo8?$W=*D1?Y6KiZKGBw
z?Y*LrSWno`Q|+aEdeQ?9zTTG(3>fBTCY3Ts5)awiXN{%IfQ9
z_u;*W69h>y*>dYMqJF^?5Y97?&g=O0^-qMcmj(HO@3^S~)I|pHG)KpOvpvAttsTJZwn7c+$PDdyhro!Ecs>QnA9Oh8oFg6g>)4c
zdV9%K;E5)j5Hn5fW}btCwElv|ZuI*DD^Uz_^XpHF>4HMj;BY)sXlx9@zliwndVx?}
zkVFuz7O=2xN0Xjqm4+a5A<`G(;jJ4IFiz&gN*Kl!k1!YF#~Ld2G#w^Nlqmn*-M$+n
z!Qt|JGpIs1}oe^FOW3PF`OD{s3f}x{rt(wd1`nM5on&*|0q=|MuTpOMoWt@
z7YrIEMuQeGvXbE@qbwPJywiB!JQ*
z2|=EmVyw^cyVUhs&|P_L`|Ff+Pef7oDM8G{oe@f+aT9bE(~c$R3wmGa119#hM>Wti
z$YDc5cU+eT@)-7ofs&iMI|L2(3Wg^J`4rZ5PP!g`peumHQr7vYD4@K
zrV^m2AEml@$RjEa;#RX-XYrKPrLLsnYsZ;OV!L;=ID-Ec6PvR?SpfNep4FOcjrO?C
z1VKaS`ueKM)wuhv8oi~OJuCq_)za6-@lZYl3zV8kMnxufQFBf$$Q)5H`4$O;&&$5<
zKDiPnhKRP;0b>u!;IAb&!W;08c`|y-v96dXi6_o-EF@+Fh4oG^XF?hq3gY_0aUa=M
zJM5ca9MRoy#>+W&=6aQ(n2m7kFld}yNuU(sxy*u8%xbZxRC2!&`-u&IM&^uak{VU0
z3Vba^ZhlBghQ8epf_HB2EwVY=JTl7&(Sh
z>zNraUkCUD%x9u8u=&Pzt?M7fsnNxFIaQzNRkN%5?#_8Ria@{a6^+3^xyn&|rsrf8
z8hpV0(*HW*Gx*|GzFc-xK$0OS>2@o_+FfrM;!tR27fg=Lpb^7$Rz_vwg+%3dfEF9
z$+2OWtMhX;(m5wh#d!si;SMFf4|sV){K}7&31oJ5u~4r*~Y3Xs-B-
zHHFPuZP@zv4r%qw(U0x$`WIP1h(%=3AZvCLC^D=kQZtl(va|+%(+jHua%l_3eJ>2=
z4(}uj6PW=Yiy+TKG%lQq7+tLC$k_tRaG5M@wZ#7(8nc+1JlZ~@Ls(dQzK7p5-?
z#*}(Q*K
z4(De;kp6SSP8rrrgA^v>POSdwFH>Ks-P7V^WqGbT`2|L;tS~Al6HyzM`yft<=?jrt
z6n40+ZBB%e8D?Xuzj(%@(6+wH@FhFD6=>d=9g+ow$vht#Ug3^>Bw=E%P*DF)I*y94
z(t3Lqz2bwS2?6Veuca@0VP8V&SX7GXk1U8Cm`oxu&ORG#1UKH&Kd^D$=Pk`|z5`e9
zsbDB=-YyOKFcdm=lsmHvRuZi@xnN%VvYo%JTx3)E3HBEMo5IyRDX_&2G=7P3;Cy{R
zqtn2RBbC|fUAp~5RU6xnFAxYwldn!Y%+=hs)bv#e7wT{l7~F@-n
zT=R4Q6RQs<;rvi8T9i=&DuB>oXs${YsSaR?3~7+{{hpDiW8Ejwc0=MyLUD<;Z0+8h
zkz&!sPShV(=eq$
zB#&ROffg@J76M+i0r5wXwESgKf4}^A($ghNofSM2I<@gomuF?0XeRJ&Vf3P;mJ5rf
zSOd|hrnzN33{x<^a5eaenfs!s_woN(&~cJln0TEJGaY?xuUOTcRV
z&Y?IN>KHgcOS;43#M7OCs12fWJF>Om2WjqsHL-FT_&4J;P---9MaWkR-F7m#(p?cDkY$bxk}K%PcA(B3a^bVSYI+0g#;>>whX4v$F5nOy3edw&}+gFhO#
z{KwXt*v{##*0)=RtQDS(iYtFPL=~-Vy|rk>Vd9V&=6udwjGCh!Gjs_cE3c}p1mhpb
z?f0QnA?%CLhO!*e#R{<4&-Y7#(wX^Dm>ib*_?4r)*oicp85j~_Dm5Rv=)ya
zTPfs(QB2Yx4Pn~0JYAydO^q3|s)8q;pI_>z05DH9a>jJbU}SK4F>$3Zb?sMG!8o7x
zd!s`@8TU!%MGu2>D~iZ2EE>>T4Asf}&FcM~Bc5Vb01w(f@Ew~@h)n7O0<>B?3j*dD
zX1~RahMGZ3{O+G}6;ZbTNs{${^5sAJ0>Fc!al24h^{oWpzSFb*EwCTy&CplJD^viF
z&5lYI5@rjkLQH4ckkYbNJ+h`b9Z$mH!v^|+=A!@BLJXCzfU;nT9a>+fJWbX)6bD?
zHnaNswEFSK&`rkav!(oOMr8{;Ta&G#ofLI_Y};~v_EXRV2EQYQztYsd))PivG*ZI<
z8mqGED+8g7W^zBfv^tvC3t(gQJDLNUaoev^2;NbYJ)eK>>+XEc4gL#gHp?Mr)@$f(
zf@P6(jdn##*2A$tBz@uy0F!wCDiI346wt?i3hvThK~k{SMUZ7{(vz9-^Y#sAMZ%us
zk7*EgwE}>=+{8xI)z&`J$Rj|Ky;2xCuU8O8V93o_iK1?6^yHTaZ1nth>Zf7tViQgH
zSkLF9=?@JUb0;8J$brFjE@NNpJb6M`QRMWe*%8op7xDm%#BW`Na%@S6`8?v?=n3Y<
zyR9agf#m0T>Wu#uucK@0Shv1^W9swZx5Ga*?J|p5xmJx!qp9t2*bNNbpDvYb&xmi0
zzIk4LhgU*KDSiVzXqF`ObRcOX?vI`XRs3HfGoZc1k2Q!O@XW0$Sb4LcnJsXEqAD1S
zlnyLTrRPybf7FPb?@BTs%cOT_
z3fJ4F2BFY-;6QS`7Q#31BpYor?o
zD~;b%*O5C;L*idK3iz|b`bp-?<2kj&j7}tb(%Xd*yT7$o!uFg4a}tcH@4XLk5g?Nh
zunI8D!7Ec8kr+RlkK^ve8(JeMsN-x_$)&P@94(!_^sD`5A$9VR@!3>))E{`8FS)aE
zx%JT3t@iD%nzvqj$8>4>2*89#lwlGoeT%no0yJrR2KEe^%`2?}Q`*s?5wA1vc4Xz)
zm;%z8L>QqN))eSM3m9f*6eun~;=9MM0j*hnYM#Zva$lgMFPIn-z
z>S89y{s1LSXqJ|U?rY=Gd>Ka**XowmfzV9z{*^HO`fM5k4fWUjl^w?yz6-7Xnxg4BKmPsTJzJM
zVn)`3{9_bvXv*q$x^61IZy4MQgd`^uYiMia&5J1}c~d3KpBAts>8Lcp>mjkn;c#06
zb*hC#f=q3aTOjvlHg|`q46rl66r@!YNW20FCRf=ztynb*M{CXx`p%IFt!~C0d_Ri)
z;;On*E_ztxeIBgj`GQvdk&$nM)r<|7j<8TbFO3{{Y^qu7m`rb)@^;^6Hq&1pW#IGV
zpwO@U-j#$+GXIMBCmBNKoMHc^_Wz|_J9)k?@~FZ?NGw33GUjt;NNq0nNDkUALk&(<
z-1=0S#h?1dFdDDdb(ti{Q-WZ)K)l%iIa{@(7;#*`c0t+Mscm?OWTlxYCcTH
z=E#c~*Nm=#?I?O4aDb(M?#3=Z@Tu8g$6$6O2;Y#*O#^7{(enM>!L#FW`7qSx`na*j
zCluc4ig=^{s=I?
zp^DEBzgz*lKYTZ?<_qJTbM=(LRXLa)t?QWUOL8qQZ=m+MJ`swGA%9(pL|Q2O>+Y*C
ztKIER>~F?kQ#qUa9*^jeqj2V}){DZ)aa0}b-de6G_K3aqVeOSCJ3Semp3ag+L)sI?
z#~>tA;{5d~07|#^)MRd=xCDE%Wc?QwEt*^7ge!38XH|tuFHSG(_p7~6lB9^~M`#vP
z+u+O^(V2xK2G+n{t-rg9?;pPe&+_2|ah|^Zd!|rLy7$P+hMEwTuRNDGCxkLp2cxP@
z8yzV?HmW+;r92wRfOGA#Ulksm=Q22(~hdpY!?(zaI$)Y9oT<#o_QV_6>v$q|Iw
z{I&`JgF%smuSGmEfgfBkiREO*?Bow?6v)Pa$Suv}_<4O1u!8GwCfk>zht5-qSL5x0
zXJIp~EbHU*PM6K%Wxcd7RYw=#j;3n&t4_x(bQ~ADl6(yaN+Nn`7
z)7<+pU9i6i9>}Quzm3`dX7v4=`kwE6Q9&nNZ)ke`-DabrHx!o061!m-iI&k(>dwv{
zamRQc#HEB|fqRaejGpw~h(m@6Bj${ZB3hoG
zvQtqSzxRL(b^=ppDMSbQRG^E8PJsSyHD)a$DEZitlLEm9sZ)IzdMaXMd(Ga%mhDa~
zz}F3B6b}Kuu7*rt@8l$bkrfTPH#cklbO~ZR*XR)iB@mvfjhbhkPar-iw7%{5#TVPx
zikOUIY;x3uQ`r3#n2*!k0D~@n9Eij}BASH*5S{;$=zmS$e>5oIaEjW*cd@$O!PvLZ
zLslJn6AKUUIsvyavx~epMpEu=0>q6%#m@2edyOfcF$w)|4sIui*DszgZnrJ_iY5sm4Bg{c3=M$pd<21!nb;w_&{5c%
zZZKfwLZWr{*n8$U^?HH6H8Rrb(m*8~UeRME>S+TQlU%gi|NdN!<
literal 0
HcmV?d00001
diff --git a/pictures/spring-cloud-ribbon.png b/pictures/spring-cloud-ribbon.png
new file mode 100644
index 0000000000000000000000000000000000000000..d874c71ed74da7d0c4dbfa2454779d8f8958742c
GIT binary patch
literal 10159
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
+
+
+
+## 三、服务提供者的实现
+
+#### 3.1 产品服务由`ProductService`提供,并通过`ProducerController`将服务暴露给外部调用。
+
+
+
+ProductService.java:
+
+```java
+/**
+ * @author : heibaiying
+ * @description : 产品提供接口实现类
+ * 这里为了之后直观的看到负载均衡的结果,我们继承了 ApplicationListener,从 WebServerInitializedEvent 获取服务的端口号,并拼接在产品名称上
+ */
+@Service
+public class ProductService implements IProductService, ApplicationListener {
+
+ private static List productList = new ArrayList<>();
+
+ public Product queryProductById(int id) {
+ for (Product product : productList) {
+ if (product.getId() == id) {
+ return product;
+ }
+ }
+ return null;
+ }
+
+ public List queryAllProducts() {
+ return productList;
+ }
+
+ @Override
+ public void saveProduct(Product product) {
+ productList.add(product);
+ }
+
+ @Override
+ public void onApplicationEvent(WebServerInitializedEvent event) {
+ int port = event.getWebServer().getPort();
+ for (long i = 0; i < 20; i++) {
+ productList.add(new Product(i, port + "产品" + i, i / 2 == 0, new Date(), 66.66f * i));
+ }
+ }
+}
+```
+
+ProducerController.java:
+
+```java
+@RestController
+public class ProducerController {
+
+ @Autowired
+ private IProductService productService;
+
+ @GetMapping("products")
+ public List productList() {
+ return productService.queryAllProducts();
+ }
+
+ @GetMapping("product/{id}")
+ public Product productDetail(@PathVariable int id) {
+ return productService.queryProductById(id);
+ }
+
+ @PostMapping("product")
+ public void save(@RequestBody Product product) {
+ productService.saveProduct(product);
+ }
+}
+```
+
+#### 3.2 将服务注册到注册中心
+
+```java
+server:
+ port: 8020
+# 指定服务命名
+spring:
+ application:
+ name: producer
+# 指定注册中心地址
+eureka:
+ client:
+ serviceUrl:
+ defaultZone: http://localhost:8010/eureka/
+```
+
+
+
+## 四、服务消费者的实现
+
+
+
+#### 4.1 导入负载均衡需要的依赖
+
+```xml
+
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-ribbon
+
+```
+
+#### 4.2 指定注册中心的地址
+
+```java
+server:
+ port: 8080
+# 指定服务命名
+spring:
+ application:
+ name: consumer
+# 指定注册中心地址
+eureka:
+ client:
+ serviceUrl:
+ defaultZone: http://localhost:8010/eureka/
+```
+
+#### 4.3 使用@LoadBalanced配置RestTemplate即可实现客户端负载均衡
+
+```java
+import org.springframework.cloud.client.loadbalancer.LoadBalanced;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class RibbonConfig {
+
+ @LoadBalanced // 配置客户端负载均衡
+ @Bean
+ public RestTemplate restTemplate() {
+ return new RestTemplate();
+ }
+}
+```
+
+#### 4.4 使用RestTemplate调用远程服务
+
+这里我们在调用远程服务的时候,url填写的是服务名+具体接口地址 ,由于我们的同一个服务会存在多个实例,在使用@LoadBalanced配置RestTemplate调用服务时,客户端就会从按照指定的负载均衡的方式将请求分摊到多个实例上。(默认的负载均衡采用的是RoundRobinRule(轮询)的策略,有特殊需求时候可以采用其他内置的策略规则,或者实现IRule来定义自己的负载均衡策略)。
+
+```java
+@Service
+public class ProductService implements IProductService {
+
+ @Autowired
+ private RestTemplate restTemplate;
+
+ public Product queryProductById(int id) {
+ ResponseEntity responseEntity = restTemplate.getForEntity("http://producer/product/{1}", Product.class, id);
+ return responseEntity.getBody();
+ }
+
+
+ public List queryAllProducts() {
+ ResponseEntity responseEntity = restTemplate.getForEntity("http://producer/products", List.class);
+ List productList = responseEntity.getBody();
+ return productList;
+ }
+
+ public void saveProduct(Product product) {
+ restTemplate.postForObject("http://producer/product", product, Void.class);
+ }
+}
+
+```
+
+
+
+## 五、启动测试
+
+#### 5.1 启动一个Eureka服务、三个producer服务(注意区分端口)、和一个消费者服务
+
+
+
+**服务注册中心:**
+
+
+
+#### 5.2 访问http://localhost:8080/sell/products 查看负载均衡的调用结果
+
+
+
+
+
+## 六、 附1: 关于RestTemplate的说明
+
+#### 6.1 restTemplate 调用对应resultful接口时候,使用的方法应该与接口声明方式(@GetMapping、@PostMapping、@PutMapping、@DeleteMapping)保持一致。请求类型与对应的调用方法如下。
+
+- GET请求(getForObject 、getForEntity)
+- POST请求(postForObject 、postForEntity)
+- PUT请求(put)
+- DELETE请求 (delete)
+
+#### 6.2 ForEntity()和ForObject的区别
+
+- `ForEntity()`发送一个请求,返回的ResponseEntity包含了响应体所映射成的对象
+
+- `ForObject()`发送一个请求,返回的请求体将映射为一个对象
+
+例如:
+
+```java
+ResponseEntity responseEntity = restTemplate.getForEntity("http://producer/product/{1}", Product.class, id);
+ Product product = restTemplate.getForObject("http://producer/product/{1}", Product.class, id);
+```
+
+
+
+## 七、 附2: 关于ribbon更多负载均衡的策略
+
+Ribbon内置了多种负载均衡策略,如果有更复杂的需求,可以自己实现IRule。
+
+#### 7.1 内置的负载均衡的策略如下图
+
+
+
+图片来源于博客:[Ribbon负载均衡策略与自定义配置](https://blog.csdn.net/jrn1012/article/details/77837680)
+
+
+
+#### 7.2 配置文件指定负载均衡的方式
+
+要设置`IRule`名为的服务名称`users`,您可以设置以下属性:
+
+```yaml
+users:
+ ribbon:
+ NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
+```
+
+
+
+#### 7.3 代码指定负载均衡的方式
+
+```java
+@Configuration
+@RibbonClient(name = "custom", configuration = CustomConfiguration.class)
+public class TestConfiguration {
+}
+```
+
+```java
+@Configuration
+public class CustomConfiguration {
+
+ @Bean
+ public IRule ribbonRule() {
+ return new BestAvailableRule();
+ }
+}
+```
+
+在使用代码方式的时候需要注意 [官方文档](http://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-ribbon.html#_customizing_the_ribbon_client)中关于注解方式有以下强调:
+
+```properties
+The CustomConfiguration clas must be a @Configuration class, but take care that it is not in a @ComponentScan for the main application context. Otherwise, it is shared by all the @RibbonClients. If you use @ComponentScan (or @SpringBootApplication), you need to take steps to avoid it being included (for instance, you can put it in a separate, non-overlapping package or specify the packages to scan explicitly in the @ComponentScan).
+```
+
+该`CustomConfiguration`类必须是`@Configuration`标注的,但需要注意的它不是在`@ComponentScan`主应用程序上下文。否则,它将由所有`@RibbonClients`共享。如果你使用`@ComponentScan`(或`@SpringBootApplication`),你需要采取一些措施来避免它被扫描到(例如,你可以把它放在一个独立的,非重叠的包,或用`@ComponentScan`时显示扫描指定的包)。
\ No newline at end of file