美文网首页
微服务 12: 各微服务之间的相互调用 Feign + Naco

微服务 12: 各微服务之间的相互调用 Feign + Naco

作者: _River_ | 来源:发表于2021-04-16 20:44 被阅读0次
 文章知识来源主要来源于:赵俊夫先生的博客  以下为原文链接
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 模块下(没有修改)

相关文章

网友评论

      本文标题:微服务 12: 各微服务之间的相互调用 Feign + Naco

      本文链接:https://www.haomeiwen.com/subject/kocylltx.html