天天看點

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 負載均衡器,實作簡單的輪詢調用

繼續閱讀