• SpringCloud(三) OpenFeign简介及@FeignClient等注解的使用


    唯能极于情,故能极于剑

    有问题或错误请及时联系小编或关注小编公众号 "CodeCow",小编一定及时回复和改正,期待和大家一起学习交流

    此文由四部分组成(OpenFeign简介、@FeignClient 使用、实操、总结),别着急,慢慢来

    一、OpenFeign

    1.1、OpenFeign 啥玩意 ?:

    • 官网:Feign 是一个声明式的Web服务客户端,让编写Web服务客户端变得非常容易,只需 创建一个接口并在接口上添加注解 即可

    1.2、OpenFeign 能干嘛 ? :

    小编就不多 BB 先来张图 压压惊

    这图不难理解:客服端调用服务端有两种方式 ribbon + restTemplate 或 Openfeign
    但是:在我们实际开发当中,往往 一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客服端类来包装这些依赖服务的调用 ;所以,OpenFeign在此基础上做了进一步封装,由他来帮助我们实现依赖服务接口的定义。
    因此:需要我们做的非常简单,我们只需要创建一个接口并使用注解的方式来配置他,即可完成对服务提供方的接口绑定。

    1.3、OpenFeign 怎么玩 ? :

    来两个 好男人 必备网站, 哈哈

    官网:cloud.spring.io/spring-cloud-static/Hoxton.SR1/reference/htmlsingle/#spring-cloud-openfeign( 贼 慢。。。。)
    GitHub:https://github.com/spring-cloud/spring-cloud-openfeign (还好,一般般)

    二、OpenFeign 实操

    了解OpenFeign 了,不来点 硬核 咋行呢,下面小编就结合实际开发和大家聊聊
    注意:有服务端客户端两个模块/项目

    2.1、 :服务端 操作

    ①、首先导包
             <!--监控 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            
            <!--Web -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!--服务注册与发现 consul-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-consul-discovery</artifactId>
            </dependency>
    ②、改 YML 配置文件
    server:
      port: 8006 //端口号
    
    spring:
      application:
        name: cloud-payment-service  //服务名
      cloud:
        consul:
          host: localhost      //consul的IP
          port: 8500           //consul启动端口默认8500
          discovery:
            service-name: ${spring.application.name}
            prefer-ip-address: true     //不写这个配置,在docker下的consul里面健康检查会失败
            healthCheckInterval: 5s     //健康检查频率
            port: ${server.port}        //注册服务所在端口
    ③、添加主启动类
    @SpringBootApplication  // springboot 注解
    @EnableDiscoveryClient    //作用:能够让注册中心发现,并扫描到该服务
    public class ProvideMain8006 {
    
        public static void main(String[] args) {
            SpringApplication.run(ProvideMain8006.class, args);
        }
    }
    ④、业务逻辑Controller
    @RestController
    @Slf4j
    public class PaymentController {
    
        @Resource
        private PaymentService paymentService;
    
        @GetMapping("/payment/get/{id}")
        public RespResult<Payment> getPaymentById(@PathVariable("id") Integer id) {
            Payment payment = paymentService.getById(id); //getById 是serviceImpl中根据id 获取 payment 实体的方法, 小编在这就不赘述了
            log.info("查询结果为:" + payment);
            if (payment != null) {
                return RespResult.success(payment); // RespResult 是小编自己封装的返回结果,不懂可以问小编
            } else {
                return new RespResult<>(444, "查询为空");
            }
        }
    }
    
                服务端就完事了:
                自测:
                    url : http://localhost:8006/payment/get/1
                    结果 :{"code":200,"message":"成功","data":{"id":1,"desc":"98K"}}
                    解释 :Payment 实体就两个字段 id、desc, 通过结果可以知道 RespResult  是啥了吧
    
                 经过 小编一顿 SAO 操作, 服务端 还可以吧   ^ _ ^

    2.1、 :客服端 / 消费端 操作

    注意:消费端大体和客服端一样,注意细节 O ^ _ ^

    ①、首先导包
             <!--监控 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            
            <!--Web -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!--服务注册与发现 consul-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-consul-discovery</artifactId>
            </dependency>
    
            <!--服务调用 openFeign-->  // 朋友:包其实就比服务端多一个 openFeign
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
    ②、改 YML 配置文件
    server:
      port: 80 //端口号  浏览网页服务默认的端口号都是80,因此只需输入网址即可,不用输入“: 80”了
    
    spring:
      application:
        name: cloud-order-service  //服务名
      cloud:
        consul:
          host: localhost      //consul的IP
          port: 8500           //consul启动端口默认8500
          discovery:
            service-name: ${spring.application.name}
            prefer-ip-address: true     //不写这个配置,在docker下的consul里面健康检查会失败
            healthCheckInterval: 5s     //健康检查频率
            port: ${server.port}        //注册服务所在端口
    
    ribbon:    // 此配置和 OpenFeign 超时控制 有关, 小编在这就不多赘述了,有想了解,直接给小编留言
      ReadTimeout: 5000  //请求处理的超时时间 5秒
      ConnectTimeout: 3000   //请求连接的超时时间 3秒
    
    logging: // 此配置和 OpenFeign 打印日志级别有关
      level:
        top.msxdlb.springcloud.service.OrderService: debug  //日志打印级别
    ③、添加主启动类
    @SpringBootApplication  // springboot 注解
    @EnableDiscoveryClient    //作用:能够让注册中心发现,并扫描到该服务
    @EnableFeignClients        //服务调用 注解
    public class ConsumerMain80 {
    
        public static void main(String[] args) {
            SpringApplication.run(ConsumerMain80.class);
        }
    }
    ④、业务逻辑 Service
    /**
    *  此类作用: 不懂看 最上面  OpenFeign 是啥玩意?
    *                          OpenFeign 能干嘛?
    */
    @Component
    @FeignClient("cloud-payment-service") //里面是服务端的  服务名(yml 文件中)
    public interface PaymentService{
    
        @GetMapping("/payment/get/{id}")
        public RespResult<Payment> getPaymentById(@PathVariable("id") Integer id);
    ④、业务逻辑 Controller
    @RestController
    @Slf4j
    public class PaymentController {
        /**
         * 使用 Feign 方式调用
         */
        @Resource
        private PaymentService paymentService; // 注入 service 中 通过 @FeignClient 定义好的接口
    
        @GetMapping("/feign/payment/get/{id}")
        public RespResult<Payment> getPayment(@PathVariable("id") Integer id) {
            log.info("<<<<<<<<<<<  我是通过feign >>>>>>>>>>>>");
            return paymentService.getPaymentById(id);
        }
    }
    
        消费端也完事了:
        总测试步骤:
                1、启动服务端
                2、启动消费端
                3、地址栏输入url: http://localhost/feign/payment/get/1  // 为什么不加端口号(回去看 消费端 Yml 配置  有说明)
                4、结果:
                        如果结果为:{"code":200,"message":"成功","data":{"id":1,"desc":"98K"}}  
                        就是和服务端自测结果一样,恭喜你  成功了
    
                 如果你 有幸看到这里:
                         咋青山不改,绿水长流,不妨看看小编其他作品,很香哟, 呵呵

    第二步OpenFeign 实操总结: 其实就两点:
    ①、在消费端启动类加:@EnableFeignClients 注解
    ②、在业务逻辑 Service 接口加: @FeignClient 注解 即可

    三、总结

    这是 SpringCloud 的 OpenFeign 篇,后续小编会从 “Hystrix、Gateway …” 等坚持以博客的方式来分享自己对SpringCloud 的理解,并从不同角度和大家分享工作心得,并且含有相关Demo,最终小编会发布到GitHub上,供大家下载、分享、交流、指正,下面是源码地址:

    GitHubhttps://github.com/msxdlb/Spring-Cloud-2020

    有问题或错误请及时联系小编或关注小编公众号 “CodeCow”,小编一定及时回复和改正 啦

    《 心有多大,舞台就有多大 》 人得有——理想

    2020/04/16 午后

  • 相关阅读:
    课堂测试-文本操作
    异常的总结
    动手动脑实验-异常
    从小工到专家-读后感3
    从小工到专家-读后感2
    从小工到专家-读后感1
    构建之法读书笔记(一)
    2.12日总结
    BaseAdapter的使用
    Activity之Bundle的使用
  • 原文地址:https://www.cnblogs.com/codecow/p/12714680.html
Copyright © 2020-2023  润新知