spring cloud feign实现服务的远程调用和负载均衡

项目结构介绍

在这里插入图片描述

test-service:作为服务的消费者
user-service:作为服务的提供者
common-service:主要用于为其他服务提供公共的方法以及依赖
author-service:权限认证服务,为其他服务模块提供权限的认证和授权
项目服务注册中心采用nacos进行服务的管理

引入依赖

正常情况下,应该直接在服务的调用者,也就是这里的test-service里面引入openFeign的,但是考虑到之后可能会引入其他的服务,所以直接把依赖放到了common-service下,避免依赖的多次引用。

<!--        引入openfeign实现服务的远程调用和负载均衡-->
     		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

接口介绍

  • user-service 提供了一个接口,供其他服务去调用

user-service 这里配置了两个实例
在这里插入图片描述

@RestController
@RequestMapping("/user")
@Api(tags = "用户测试接口")
public class TestController {


    @Value("${server.port}")
    private String port;
    @PostMapping("/test")
    @ApiOperation(value="测试swagger",notes = "测试swagger")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "num",value = "数字")
    })
    @LogAnnotation(methodName = "测试swagger",methodDesc = "测试接口",methodType = MethodType.FIND_TYPE)
    public void callback( Integer num) {
        System.out.println("请求成功了。。。。"+port);
    }
}
  • 服务调用者(test-service)下创建和服务提供者接口方法相同名称的service方法
@FeignClient(name = "userService")//开启指定服务的远程调用
public interface TestService {

    @PostMapping("/user/test")
    public void callback( @RequestParam(name = "num") Integer num);
}

但有两点需要注意:

  1. 当使用get方法时,需要使用@RequestParam注解进行参数绑定,否则会识别成post方法
  2. 当使用get进行请求时,如果传递的参数是对象的化,spring boot2.1版本后需要在参数前面添加@SpringQueryMap注解;之前添加@RequestParam

负载均衡策略实现

  • 创建负载均衡策略
@Configuration
public class MyRuleConfig {

    @Bean
    public IRule iRule(){
        return new RandomRule();//随机策略
    }
}
  • 负载均衡策略修改

负载均衡策略的修改支持两种方式:配置文件和在启动类上进行配置

  1. 在调用者配置文件中配置
userService: #服务提供者的实例名
    ribbon:
      NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
  1. 在调用者启动类中配置
@SpringBootApplication(scanBasePackages = {"cn.hd"})
@EnableDiscoveryClient//启用nacos的服务注册发现
@EnableFeignClients//开启远程调用
@RibbonClient(name = "userService",configuration = MyRuleConfig.class)//负载均衡策略配置
public class TestServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestServiceApplication.class, args);
    }

}

测试

在这里插入图片描述

ribbon支持的负载均衡策略

策略说明
轮询(RoundRobinRule)按照一定的顺序依次调用服务实例。
权重策略(WeightedResponseTimeRule)根据每个服务提供者的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性也就越低。它的实现原理是,刚开始使用轮询策略并开启一个计时器,每一段时间收集一次所有服务提供者的平均响应时间,然后再给每个服务提供者附上一个权重,权重越高被选中的概率也越大。
随机策略(RandomRule)从服务提供者的列表中随机选择一个服务实例
最小连接数策略(BestAvailableRule)也叫最小并发数策略,它是遍历服务提供者列表,选取连接数最小的⼀个服务实例。如果有相同的最小连接数,那么会调用轮询策略进行选取。
重试策略(RetryRule)按照轮询策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试来获取服务,如果超过指定时间依然没获取到服务实例则返回 null。
可用性敏感策略(AvailabilityFilteringRule)先过滤掉非健康的服务实例,然后再选择连接数较小的服务实例。
区域敏感策略(ZoneAvoidanceRule)根据服务所在区域(zone)的性能和服务的可用性来选择服务实例,在没有区域的环境下,该策略和轮询策略类似。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何一平?

你的收获就是我学习的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值