项目结构介绍
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);
}
但有两点需要注意:
- 当使用get方法时,需要使用@RequestParam注解进行参数绑定,否则会识别成post方法
- 当使用get进行请求时,如果传递的参数是对象的化,spring boot2.1版本后需要在参数前面添加@SpringQueryMap注解;之前添加@RequestParam
负载均衡策略实现
- 创建负载均衡策略
@Configuration
public class MyRuleConfig {
@Bean
public IRule iRule(){
return new RandomRule();//随机策略
}
}
- 负载均衡策略修改
负载均衡策略的修改支持两种方式:配置文件和在启动类上进行配置
- 在调用者配置文件中配置
userService: #服务提供者的实例名
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
- 在调用者启动类中配置
@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)的性能和服务的可用性来选择服务实例,在没有区域的环境下,该策略和轮询策略类似。 |