天天看点

spring cloud ribbon 负载均衡器,实现简单的轮询调用

ribbon实现步骤

  • 一:创建eureka,两个producter服务(不做介绍),一个ribbon服务
  • 二:ribbon服务
  1. pom
<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
			<groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
            <version>1.4.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
           
  1. application.properties配置
server.port= 9010
spring.application.name= server-ribbon
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:9000/eureka
           
  1. 新建collection
@RestController
public class TestController {
    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @RequestMapping("/test")
    public String test() throws ExecutionException, InterruptedException {
        //server-producer为 producer服务的 spring.application.name=server-producer
        //两个服务的名称一致,端口不一致,(本demo分别为:9101和9101)
        ServiceInstance serviceInstance = loadBalancerClient.choose("server-producer");
        //负载均衡算法默认是轮询,轮询取得服务
        URI uri = URI.create(String.format("http://%s:%s", serviceInstance.getHost(), serviceInstance.getPort()));
        return uri.toString();
    }
}
           
  • 启动服务进行测试

    浏览器访问 http://localhost:9010/test

    出现不同端口

    spring cloud ribbon 负载均衡器,实现简单的轮询调用
    spring cloud ribbon 负载均衡器,实现简单的轮询调用
  • 三:实现简单的接口调用
  1. 在原有基础上进行添加,(本例中两个producter服务,接口路径,服务名均相同,除端口,test接口返回值不同,其余相同)
  2. application.properties配置添加
server.port= 9010
spring.application.name= server-ribbon
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:9000/eureka
//为特定的服务配置负载均衡策略(server-producer服务名)
server-producer.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
           
  1. 在ribbon服务启动类添加,和@EnableDiscoveryClient注解
@SpringBootApplication
@EnableDiscoveryClient
public class RibbonApplication {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(RibbonApplication.class, args);
    }
}
           
  1. 在testCollection添加test1方法
@Autowired
    private LoadBalancerClient loadBalancerClient;
	//注入 RestTemplate 
    @Autowired
    private RestTemplate restTemplate;
	@GetMapping("/test1")
 	public String test1() {
        ServiceInstance serviceInstance = loadBalancerClient.choose("server-producer");
		//http://这里是服务名(server-producer)/这里collection对应路径(test)
        String s = this.restTemplate.getForObject("http://server-producer/test", String.class);
        return s+serviceInstance.getPort();
    }
           
  1. 启动测试
    spring cloud ribbon 负载均衡器,实现简单的轮询调用
    spring cloud ribbon 负载均衡器,实现简单的轮询调用
    至此简单的轮询调用完成

结合 - 断路器使用

  • 当某一个服务出现宕机,异常时可配置
  • 添加pom
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
            <version>1.4.5.RELEASE</version>
        </dependency>
           
  • 启动类添加@EnableHystrix注解
  • 修改testCollection
//fallbackMethod = "getServiceError"  getServiceError为调用方法
 	@HystrixCommand(fallbackMethod = "getServiceError")
    @GetMapping("/test1")
    public String test1() {
        ServiceInstance serviceInstance = loadBalancerClient.choose("server-producer");
        String s = this.restTemplate.getForObject("http://server-producer/test", String.class);
        return s+serviceInstance.getPort();
    }

    public String getServiceError() {
        return "出现错误!!!!;调用getServiceError()";
    }
           
  • 启动测试

    依次启动eureka,两个producter,ribbon,能正常轮询访问后,停掉其中一个producter服务,再次访问 http://localhost:9010/test1

    当调用停止的服务时

    spring cloud ribbon 负载均衡器,实现简单的轮询调用
    正常时
    spring cloud ribbon 负载均衡器,实现简单的轮询调用

继续阅读