目录
| 策略类 | 负载策略 | 描述 |
|---|---|---|
| RoundRobinRule | 轮询策略 | 按照顺序选择server(默认) |
| RandomRule | 随机策略 | 随机选择server |
| RetryRule | 重试策略 | 当选择server不成功,短期内尝试选择一个可用的server |
| AvailabilityFilteringRule | 可用过滤策略 | 过滤掉一直失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server(active connections超过配置的阈值) |
| WeightedResponseTimeRule | 响应时间加权重策略 | 根据server的响应时间分配权重,以响应时间作为权重,响应时间越短的服务器被选中的概率越大,综合了各种因素,比如:网络,磁盘,io等,都直接影响响应时间 |
| ZoneAvoidanceRule | 区域权重策略 | 综合判断server所在区域的性能,和server的可用性,轮询选择server |
- ### 服务提供者
- order-service:
- ribbon:
- # 指定负载均衡的全限定类名
- NFloadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
1:子服务中添加依赖
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-starter-openfeignartifactId>
- dependency>
2:启动类添加注解
@EnableFeignClients
3:在服务调用方添加一个接口
- // name:指定服务提供方名称
- @FeignClient(name="order-service")
- @FeignClient(name = "order-service")
- public interface OrderService {
-
- @GetMapping("/order/one") // 这里写被调用方的接口路径
- OrderDO getOne(@RequestParam("orderId") Long orderId); // 变量参数要带 @RequestParam
-
- @PostMapping("/order/save") // post 请求的方式
- int save(@RequestBody OrderDO orderDO); // 对象参数要带 @RequestBody
-
- }
4:feign调用接口
- @Service
- public class UserServiceImpl implements UserService {
-
- @Autowired
- private OrderService orderService;
-
- @Override
- public OrderDO getOrderDetail(Long orderId) {
- return orderService.getOne(orderId);
- }
-
- @Override
- public Integer save(OrderDO orderDO) {
- return orderService.save(orderDO);
- }
- }
feign作用
- 声明式Http Client相对于编程式Http Client代码逻辑更加简洁,不需要处理复杂的编码请求和响应,只需要像调用本地方法即可,提高编码效率
- 集中管理Http请求方法,代码边界更加清晰
- 更好的集成负载均衡、熔断降级等功能
feign使用了两个注解@EnableFeignClients @FeignClient,EnableFeignClients开启feign,在spring装载的时候载入有FeignClient注解的接口成spring的BeanDefinition,spring管理这些bean,使用的时候@Autowired就可以。上面说了feign是简化我们对httpClient的调用,我们使用一行注解就可以完成httpClient的操作了,可以想到那些httpClient操作肯定是通过SpringAop动态代理的方式做了。更多源码分析请阅读:Feign底层原理分析
* 注意:不在同一命名空间下的服务进行feign调用时,要确保nacos账号有不同命名空间的操作权限,不然feign会找不到服务,报错Load balancer does not have available server for client: xxx