一.概述
微服务的部署往往是集群模式,一个微服务往往有多个节点,ribbon提供了客户端负载均衡算法,让我们能够实现压力分摊的调用.
二.微服务集成ribbon.
1.我们可以看到openfeign中有了ribbon相关的依赖,默认实现了负载均衡.
2.我们编写代码测试下.
(1).rpc调用服务端(server-basic).
a.RibbonTestProducerController.java
package com.ccm.server.basic.controller;
import com.ccm.common.exception.result.ResultSet;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description ribbon负载均衡测试服务端
* @Author zhouzhiwu
* @CreateTime 2020/07/18 19:37
*/
@RestController
@RequestMapping(value = "ribbonTestProducer")
@Api(tags = "ribbon负载均衡测试服务端")
public class RibbonTestProducerController {
@Value("${server.port}")
private String port;
@ApiOperation(value = "ribbon负载均衡测试")
@GetMapping(value = "test01")
public ResultSet test01() {
return ResultSet.success("我是server-basic的数据,端口="+port);
}
}
(2).rpc调用客户端(server-user).
a.RibbonTestConsumerController.java
package com.ccm.server.user.controller;
import com.ccm.common.exception.ServerException;
import com.ccm.common.exception.result.ResultSet;
import com.ccm.server.user.openfeign.ServerBasicFeign;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description ribbon负载均衡测试客户端
* @Author zhouzhiwu
* @CreateTime 2020/07/18 19:37
*/
@RestController
@RequestMapping(value = "ribbonTestProducer")
@Api(tags = "ribbon负载均衡测试服务端")
public class RibbonTestConsumerController {
@Autowired
private ServerBasicFeign serverBasicFeign;
@ApiOperation(value = "ribbon负载均衡测试")
@GetMapping(value = "test01")
public ResultSet test01() {
ResultSet<String> feignVO = serverBasicFeign.test02();
if(feignVO.getCode() == 0) {
return ResultSet.success(feignVO.getData());
}
throw new ServerException("调用外部服务失败");
}
}
b.ServerBasicFeign.java,见方法test02
package com.ccm.server.user.openfeign;
import com.ccm.common.exception.result.ResultSet;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
/**
* @Description 调用server-basic的feign层
* @Author zhouzhiwu
* @CreateTime 2020/07/17 9:46
*/
@FeignClient(name = "server-basic")
public interface ServerBasicFeign {
@GetMapping(value = "openFeignTest/test01")
ResultSet<String> test01();
@GetMapping(value = "ribbonTestProducer/test01")
ResultSet<String> test02();
}
(3).server-basic启动两个服务,端口分别为2001和2002,server-user服务只用启动一个.
(4).swagger测试,可以看出默认的负载均衡规则是轮询模式.
(5).修改ribbon负载均衡算法规则,可以自行测试.
package com.ccm.server.user.config;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Description ribbon负载均衡配置
* @Author zhouzhiwu
* @CreateTime 2020/07/18 20:12
*/
@Configuration
public class RibbonConfig {
@Bean
public IRule rule(){
//return new RoundRobinRule();//轮询
//return new RetryRule();//重试
return new RandomRule();
}
}