启动几个项目,有
8761 Eureka server,是服务端
microservice-provider-user 启动7900,7901,是服务提供者
microservice-provider-user2 启动7902,7903,是服务提供者
microservice-customer-movie-ribbon 启动8010,是服务消费者
16.2. Customizing the Ribbon Client
在项目microservice-customer-movie-ribbon中
TestConfiguration。注意他不可以放在启动类的@ComponentScan可以扫描的包下面。(启动类可以扫描到同一目录或者子包下面可以的注解)
package com.ldgx.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.netflix.client.config.IClientConfig; import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.RandomRule; /** * The TestConfiguration has to be @Configuration but take care that it is not in a @ComponentScan for the main application context, * otherwise it will be shared by all the @RibbonClients. If you use @ComponentScan (or @SpringBootApplication) * you need to take steps to avoid it being included (for instance put it in a separate, non-overlapping package, or specify the packages to scan explicitly in the @ComponentScan). * @author Administrator * */ @Configuration public class TestConfiguration { //@Autowired //private IClientConfig config; @Bean public IRule ribbonRule(IClientConfig config) { return new RandomRule();//随机规则 } }
启动类com/ldgx/eshop/MicroserviceCustomerMovie1Application.java增加
@RibbonClient(name="microservice-provider-user",configuration = TestConfiguration.class)
Controller
package com.ldgx.eshop.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class UseDemoController { @Autowired private RestTemplate restTemplate; @Autowired private LoadBalancerClient loadBalanceClient; @RequestMapping("/demo") public String useDemo() { return restTemplate.getForObject("http://microservice-provider-user/demo/dd", String.class);//参数1使eureka的service-id,是个虚拟主机名,可以用eureka.instance.secure.virtual-host-name定义,如果不是https的,就用eureka.instance.virtual-host-name } @RequestMapping("/test") public String test() { ServiceInstance instance = this.loadBalanceClient.choose("microservice-provider-user"); System.out.println(instance.getHost() + "," + instance.getPort() +","+instance.getServiceId()); ServiceInstance instance2 = this.loadBalanceClient.choose("microservice-provider-user2"); System.out.println(instance2.getHost() + "," + instance2.getPort() +","+instance2.getServiceId()); return "1"; } }
当在浏览器上访问地址http://localhost:8010/test的时候
项目microservice-customer-movie-ribbon打印结果:
IDXZC2FNKSQOYM6,7900,microservice-provider-user IDXZC2FNKSQOYM6,7903,microservice-provider-user2 IDXZC2FNKSQOYM6,7901,microservice-provider-user IDXZC2FNKSQOYM6,7902,microservice-provider-user2 IDXZC2FNKSQOYM6,7901,microservice-provider-user IDXZC2FNKSQOYM6,7903,microservice-provider-user2 IDXZC2FNKSQOYM6,7900,microservice-provider-user IDXZC2FNKSQOYM6,7902,microservice-provider-user2 IDXZC2FNKSQOYM6,7900,microservice-provider-user IDXZC2FNKSQOYM6,7903,microservice-provider-user2 IDXZC2FNKSQOYM6,7901,microservice-provider-user IDXZC2FNKSQOYM6,7902,microservice-provider-user2 IDXZC2FNKSQOYM6,7901,microservice-provider-user IDXZC2FNKSQOYM6,7903,microservice-provider-user2 IDXZC2FNKSQOYM6,7900,microservice-provider-user IDXZC2FNKSQOYM6,7902,microservice-provider-user2 IDXZC2FNKSQOYM6,7901,microservice-provider-user IDXZC2FNKSQOYM6,7903,microservice-provider-user2 IDXZC2FNKSQOYM6,7900,microservice-provider-user IDXZC2FNKSQOYM6,7902,microservice-provider-user2得到结果:microservice-provider-user是随机的, microservice-provider-user2是默认的规则(轮询)
问题:如果想Configuration移动到其它包怎么办那?
定义标签
package com.ldgx.eshop; public @interface ExcludeFromComponent { }
TestConfiguration类增加
@ExcludeFromComponent启动类增加
@ComponentScan(excludeFilters = {@ComponentScan.Filter(type=FilterType.ANNOTATION,value=ExcludeFromComponent.class)})//不扫描注解ExcludeFromComponent注解的类
16.4 Customizing the Ribbon Client using properties
application.yml,重点
NFLoadBalancerRuleClassName:负载均衡的算法
microservice-provider-user: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
运行结果如上,得出结论:microservice-provider-user采用了随机原则,microservice-provider-user2采用了轮询的原则。
16.5 Using Ribbon with Eureka
在spring.application.name=microservice-provider-userde元数据
eureka.instance.metadata-map.zone=ABC #eureka可以理解的元数据 eureka.instance.metadata-map.lilishow=BBC #不会影响客户端的元数据
在浏览器输入地址http://localhost:8761/eureka/apps/microservice-provider-user
得到
16.6 Example: How to Use Ribbon Without Eureka
ribbon: eureka: enabled: false #如果classpath下面有eureka,怎么禁用(Disable Eureka use in Ribbon) microservice-provider-user: ribbon: listOfServers: localhost:7900运行结果
localhost,7900,microservice-provider-user localhost,7900,microservice-provider-user localhost,7900,microservice-provider-user localhost,7900,microservice-provider-user localhost,7900,microservice-provider-user localhost,7900,microservice-provider-user localhost,7900,microservice-provider-user得出结果,禁用了ribbon负载均衡,只调用了7900端口