目录与学习目标

  1. 1:服务间的调用
  2. 2Feign调用
  3. 3:代码实战
  4. 1Feign是什么?
  5. 2OpenFeign又是什么?
  6. 3:调用流程总览(重要)
  7. 3:代码实战
  8. 1:新增模块 service-provider-demo-feign
  9. 2service-provider-consumer 改动
  10. 3service-provider-demo 服务修改
  11. 4service-provider-demo-other 服务修改
  12. 4:调用测试
  13. 1:设置Feign的负载均衡策略
  14. 2:以网关作为入口进行调用
  15. 3SpringBootRunDashboard如何显示出来

1:服务间的调用

外部请求 通过服务网关来调用注册中心的 微服务,
那么这个时候 外部请求 实际上已经经过层层校验了 
后续也不需要网关进行校验了 

那么各微服务之间怎样优雅简洁的直接相互调用呢?

这个时候我们可以添加给微服务比如 service-provider-demo 新增一个服务
service-provider-dem-feign 服务作为入口

1:外面的其他服务直接调用 service-provider-dem-feign 服务
2:service-provider-dem-feign 服务(作为入口) 调用 service-provider-demo服务

2:Feign调用

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:调用流程总览(重要)

image.png
image.png

 一共有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  同样也具有负载均衡功能

3:代码实战

1:新增模块 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();
}

2: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);
        }
    }
}

3: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";
    }

}

4: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";
    }

}

4:调用测试

1:设置Feign的负载均衡策略

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次

image.png
image.png

轮训策略:
    按服务调用次数
    两种都是15次

image.png
image.png

权重策略: 
    按权重 权重越大 调用占比越高
    ServiceDemoProvider         9992     权重为2  对应20次请求
    ServiceDemoProvideOther  9993      权重为1  对应10次请求

image.png

image.png
image.png

2:以网关作为入口进行调用

//网关跳转请求到nacos-consumer服务
http://127.0.0.1:9000/nacos-consumer/providerDemoFeignClient/test

image.png
image.png

3:SpringBoot的RunDashboard如何显示出来

1:在服务设置的地方 点击复制生成另一个服务 

2:然后在右下角会有一个 设置RunDashboard的提示
    点击Show run configurations in Run Dashoard即可

image.png
image.png
image.png

项目连接

请配合项目代码食用效果更佳:
项目地址:
https://github.com/hesuijin/spring-cloud-alibaba-project

在service-provider-demo-feign模块下
在service-consumer-demo 模块下

在service-provider-demo 模块下   (没有修改) 
在service-provider-demo-other 模块下(没有修改)