码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 微服务与中间件系列——Feign


    微服务与中间件系列——Feign

    • Feign
      • QuickStart
        • 准备工作
          • 构建如下微服务项目
          • 引入使用Nacos
        • 1.引入依赖
        • 2.完成service模块业务
          • 2.1 编写TestService接口
          • 2.2编写TestServiceImpl
          • 2.3编写TestController
        • 3.完成Client模块服务调用业务
          • 3.1@EnableFeignClients开启Feign注解
          • 3.2编写Client接口进行指定
          • 3.3编写外部暴露的client的controller
        • 4.测试
      • QuickStart的对应讲解
      • Feign配置
        • yaml配置修改
          • 全局
          • 单个服务
        • 代码形式修改
          • 1.声明一个Bean
          • 2. 添加注解
            • 全局
            • 单个服务
      • 采用连接池替换Feign底层
        • 使用HttpClient
          • 1.引入依赖
          • 2.修改yaml配置
      • 抽取Feign形成独立模块
        • 1.新建项目
        • 2.将配置等移入feign-service
        • 3.在需要的服务中引入
        • 4.设置扫描包
          • 指定包下扫描所有
          • 指定FeignClient字节码

    Feign

    Feign的引入使得我们能够解决:

    1. 远程调用可读性差,编程体验不统一
    2. 参数复杂URL难以维护
    3. 负载均衡的实现

    Feign是一个声明式的http客户端,官方地址: https://github.com/OpenFeign/feign其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题

    QuickStart

    准备工作

    构建如下微服务项目

    在这里插入图片描述

    引入使用Nacos

    如果你对这个地方有问题,请参照:微服务与中间件系列——Nacos快速使用

    1.引入依赖

    在这里插入图片描述

    		<dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4

    2.完成service模块业务

    在这里插入图片描述

    2.1 编写TestService接口
    public interface TestService {
        void test();
    }
    
    • 1
    • 2
    • 3
    2.2编写TestServiceImpl
    @Service
    public class TestServiceImpl implements TestService {
        @Override
        public void test() {
            System.out.println("test....");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    2.3编写TestController
    @RestController
    public class TestController {
        @Autowired
        private TestService testService;
    
        @GetMapping("/service/test/{id}")
        public String test(@PathVariable("id")String id){
            testService.test();
            return id;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3.完成Client模块服务调用业务

    在这里插入图片描述

    3.1@EnableFeignClients开启Feign注解

    找到启动类添加@EnableFeignClients注解

    @EnableFeignClients
    @SpringBootApplication
    public class Test1Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Test1Application.class, args);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    3.2编写Client接口进行指定
    @FeignClient("testService")
    public interface TestFeignClient {
        @GetMapping("/test/{id}")
        String test(@PathVariable("id") int id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    3.3编写外部暴露的client的controller
    @RestController
    public class ClientController {
    
        @Autowired
        private TestClient testClient;
    
        @GetMapping("/test/{id}")
        public String testFeign(@PathVariable("id")String id){
            final String test = testClient.test(id);
            return test;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4.测试

    如下你可以分为client中暴露的服务达到访问实际在service模块中的服务
    在这里插入图片描述
    在这里插入图片描述

    QuickStart的对应讲解

    访问流程:

    1. 浏览器访问http://localhost:8080/test/6
    2. client服务进行接收处理
    3. 交由Feign指派
    4. 实际service服务进行处理

    在这里插入图片描述

    Feign配置

    一般来说我们需要自己配置日志级别

    类型作用说明
    feign.Logger.Level修改日志级别包含四种不同的级别:NONE、BASIC、HEADERS、FULL
    feign.codec.Decoder响应结果的解析器http远程调用的结果做解析,例如解析json字符串为java对象
    feign.codec.Encoder请求参数编码将请求参数编码,便于通过http请求发送
    feign. Contract支持的注解格式默认是SpringMVC的注解
    feign.Retryer失败重试机制请求失败的重试机制,默认是没有,不过会使用Ribbon的重试

    yaml配置修改

    注意请配置在消费者中
    这里是对日志的配置修改,在开发中可以采用Basic,上线后请关闭日志以确保性能

    全局
    # config下写default表示全局生效
    feign:
      client:
        config: 
          default:
            loggerLevel: FULL
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    单个服务

    写服务的名称则是某个服务生效

    spring:
      application:
        name: testService
    
    feign:
      client:
        config:
          testService:
            loggerLevel: FULL
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    代码形式修改

    1.声明一个Bean
    public class FeignConfig{
    	@Bean
    	public Logger.Level feignLogLevel(){
    		return Logger.Level.FULL
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    2. 添加注解
    全局

    找到启动类

    @EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
    
    • 1
    单个服务
    @FeignClient(value = "userservice",configuration = FeignclientConfiguration.class)
    
    • 1

    采用连接池替换Feign底层

    采用连接池可以优化Feign的性能,代替URLConnection

    使用HttpClient

    1.引入依赖
    <!-- https://mvnrepository.com/artifact/io.github.openfeign/feign-httpclient -->
    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-httpclient</artifactId>
        <version>11.9</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    2.修改yaml配置
    feign:
      client:
        config:
          default:
            loggerLevel: BASIC
      httpclient:
        enabled: true # 开启
        max-connections: 100 # 最大连接数
        max-connections-per-route: 25 #每个路径的最大连接数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    抽取Feign形成独立模块

    将FeignClient抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用
    在这里插入图片描述

    1.新建项目

    在这里插入图片描述

    2.将配置等移入feign-service

    3.在需要的服务中引入

            <dependency>
                <groupId>com.example</groupId>
                <artifactId>feign-service</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.设置扫描包

    @SpringBootApplication
    @EnableFeignClients(clients = TestClient.class)
    public class ClientApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ClientApplication.class, args);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    指定包下扫描所有
    @EnableFeignCLients(basePackages = "包所在的地址")
    
    • 1
    指定FeignClient字节码
    @EnableFeignClients(clients = TestClient.class)
    
    • 1
  • 相关阅读:
    配置元数据存储为MySql&再次启动测试---大数据之Hive工作笔记0008
    【java】单例模式双重检验锁
    Maven optional的作用
    量子计算(十):量子计算原理
    使用pro-components遇到的问题
    k8s实用命令
    value_counts()与count()的简单介绍
    【数独问题】递归+回溯算法求解数独问题
    springMVC的学习【中】
    群狼调研开展连锁酒店神秘顾客调查项目
  • 原文地址:https://blog.csdn.net/qq_51553982/article/details/126502779
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号