您的位置:首页 > 编程语言 > Java开发

spring cloud学习——16. Client Side Load Balancer: Ribbon

2018-02-06 16:41 489 查看
启动几个项目,有
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端口
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: