文章知识来源主要来源于:赵俊夫先生的博客 以下为原文链接
https://blog.csdn.net/u011177064/category_9572944.html
1:服务间的调用
外部请求 通过服务网关来调用注册中心的 微服务,
那么这个时候 外部请求 实际上已经经过层层校验了
后续也不需要网关进行校验了
那么各微服务之间怎样优雅简洁的直接相互调用呢?
这个时候我们可以添加给微服务比如 service-provider-demo 新增一个服务
service-provider-dem-feign 服务作为入口
1:外面的其他服务直接调用 service-provider-dem-feign 服务
2:service-provider-dem-feign 服务(作为入口) 调用 service-provider-demo服务
1:Feign是什么
(使用上注解是@Feign)
Feign是一个声明式Web Service客户端。
使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。
Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。
Feign可以与和Ribbon组合使用以支持负载均衡。
2:OpenFeign又是什么?
使用上注解是@FeignClient
OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。
OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,
并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
3:流程总览(重要 重要 重要)
一共有4个服务
service-provider-consumer (9991 服务名称 nacos-consumer)
service-provider-demo-feign (9994 服务名称 nacos-provider-feign)
service-provider-demo (9992 服务名称 nacos-provider)
service-provider-demo-other (9993 服务名称 nacos-provider)
1:外部 或者 网关(网关的负载均衡)调用service-provider-consumer 接口
2:service-provider-consumer 服务的启动类使用了@EnableFeignClients注解 可以引用Feign包
service-provider-consumer 在maven使用jar包的方式引用 service-provider-demo-feign 的jar包
3:service-provider-consumer 接口 里面 调用了 service-provider-demo-feign 的 provider-feign类的方法
4:service-provider-demo-feign 服务的 provider-feign类的方法 作为 provider服务的入口
5:provider-feign类的方法 调用 服务名称为 nacos-provider服务 的相同路径的接口
6:service-provider-demo-feign 在调用的时候 自带负载均衡策略
而nacos-provider服务 有可能是 service-provider-demo 或者 service-provider-demo-other
则在调用的时候 按照service-provider-demo-feign的负载均衡策略 来调用nacos-provider服务
特别注意:
这里并没有用到网关服务 就是为了特别强调 GateWay+Nacos 具有负载均衡功能
而 Feign+Nacos 同样也具有负载均衡功能
4:新增模块 service-provider-demo-feign
复制service-provider-demo的
pom配置 service-provider-demo-feign 新增 OpenFeign Maven包
yml配置 service-provider-demo-feign 修改服务名称为 nacos-provider-feign
修改端口号
<!-- 引入OpenFeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
新增接口
@FeignClient(name = "nacos-provider" )
public interface ProviderFeignClientService {
/**
* 入口 调用 provider的/loadBalance/print 方法
* @return
*/
@GetMapping(value = "/loadBalance/print")
String print();
}
5: service-provider-consumer 改动
service-provider-consumer服务 启动类 新增注解
@EnableFeignClients
表示该类可以引用 Feign包
service-provider-consumer服务 新增接口
可以使用postman直接调用该接口
@RestController
@RequestMapping(value = "/providerDemoFeignClient")
@Slf4j
public class ProviderDemoFeignClient {
@Autowired
ProviderFeignClientService providerFeignClientService;
@GetMapping(value = "/test")
public void providerDemoFeignClientTest(){
log.info("请求/providerDemoFeignClient/test");
//1:外部请求网关服务 经过校验
//2:网关服务请求consumer 服务
//3:consumer服务 请求 providerFeignClient服务
//4:providerFeignClient服务 请求 provider服务
String resp;
for (int i = 0; i < 30; i++) {
resp = providerFeignClientService.print();
log.info("请求结果:{}",resp);
}
}
}
6:service-provider-demo 服务修改(原本就有的)
@RestController
@Slf4j
public class NacosRobin {
@GetMapping(value = "/loadBalance/print")
public String print() {
log.info(new Date() + "调用:我是服务 service-provider-demo");
return "我是服务 service-provider-demo";
}
}
7:service-provider-demo-other 服务修改(原本就有的)
@RestController
@Slf4j
public class NacosRobin {
@GetMapping(value = "/loadBalance/print")
public String print() {
log.info(new Date() + "调用:我是服务 service-provider-demo-other");
return "我是服务 service-provider-demo";
}
}
8:调用测试
Feign 服务自定义负载均衡策略
@SpringBootApplication
public class ServiceProviderDemoFeignApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceProviderDemoFeignApplication.class, args);
}
// /**
// * 轮训策略
// * @return
// */
// @Bean
// @Scope(value="prototype")
// public IRule loadRoundBalanceRule(){
// return new RoundRobinRule();
// }
// /**
// * 权重策略
// * @return
// */
// @Bean
// @Scope(value="prototype")
// public IRule loadNacosBalanceRule(){
// return new NacosRule();
// }
}
对Feign进行30次请求
默认策略:
按时间片随机
一个16次 一个14次
轮训策略:
按服务调用次数
两种都是15次
权重策略:
按权重 权重越大 调用占比越高
ServiceDemoProvider 9992 权重为2 对应20次请求
ServiceDemoProvideOther 9993 权重为1 对应10次请求
9:以网关作为入口进行调用
//网关跳转请求到nacos-consumer服务
http://127.0.0.1:9000/nacos-consumer/providerDemoFeignClient/test
10:SpringBoot的RunDashboard如何显示出来
1:在服务设置的地方 点击复制生成另一个服务
2:然后在右下角会有一个 设置RunDashboard的提示
点击Show run configurations in Run Dashoard即可
项目连接
请配合项目代码食用效果更佳:
项目地址:
https://github.com/hesuijin/spring-cloud-alibaba-project
Git下载地址:
https://github.com.cnpmjs.org/hesuijin/spring-cloud-alibaba-project.git
在service-provider-demo-feign模块下
在service-consumer-demo 模块下
在service-provider-demo 模块下 (没有修改)
在service-provider-demo-other 模块下(没有修改)