码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • SpringCloud学习(七)----- 使用Feign调用别的微服务的方法


    SpringCloud版本:2021.0.1     SpringBoot版本:2.6.3

    系列文章

    SpringCloud学习(一)----- Eureka搭建

    SpringCloud学习(二)----- SpringBoot Admin搭建(与Eureka整合)

    SpringCloud学习(三)----- Gatewayw网关搭建

    SpringCloud学习(四)----- Gatewayw网关完善(限流)

    SpringCloud学习(五)----- Gatewayw网关完善(Resilience4j断路器)

    SpringCloud学习(六)----- Gatewayw网关完善(防止SQL注入)

    SpringCloud学习(七)----- 使用Feign调用别的微服务的方法

    SpringCloud学习(八)----- Gateway网关及其他微服务接入Swagger接口文档

    参考文章:

    Spring Cloud微服务之间的调用

    今日教学:RestTemplate 结合 Ribbon 使用

    FEIGN调用出现权限问题 FEIGN.FEIGNEXCEPTION$UNAUTHORIZED: [401] DURING [GET] TO[....]

    因为在微服务的框架中,已经把所有的服务的功能区分的很细了,所以有可能会出现一种问题,就是比如某个微服务需要用到某个功能,但这个功能已经划分在别的服务并已经开发完成了,那么这个时候就可以用到Feign这个来调用别的服务的方法了。

    一、微服务之间一般用什么方法来进行互相的方法调用 ?

            一般常用的有两种方法,即Ribbon + RestTemplate进行微服务调用或者使用Feign进行微服务调用。当然,也有一个最原始的方法,那就是http接口,这个也可以实现微服务之间的方法的调用的功能,但就是比较麻烦,头铁的可以试试。那么,Ribbon + RestTemplate和Feign这两种方法有什么区别吗?那当然是有的,但也没有那么大的区别。

    1、它们的启动类注解不同,Ribbon是@RibbonClient,Feign的是@EnableFeignClients。

    2、服务指定的位置不同,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象方法的接口中使用@FeignClient声明。

    3、调用方式不同,Ribbon需要自己构建http请求,先模拟http请求然后再使用RestTemplate发送给其他服务,步骤比较繁琐。但Feign只需要将调用的方法定义成抽象方法即可,当然,前提是得已经把服务注册到注册中心。

    那么,它们之间对比下来,那个更好呢?

    1、Ribbon弊端:代码里会充斥着大量的url,在小型项目中还好,但在大型项目里,维护成本就会很高了。

    2、Feign弊端:如果微服务调用的方法入参发生了变化,那么对应的Feign方法也得进行相应的更改,但这个我觉得还是可以接受的。

    不过呢,一般开发人员都会选用Feign来进行微服务之间的调用,因为如果真的使用Ribbon + RestTemplate的话,那么维护成本就太高了,相比较下,Feign还是比较好的。

    那么,回归主题,首先简单介绍一下Ribbon + RestTemplate的使用。

    1、Ribbon + RestTemplate

    首先,是Ribbon的pom依赖导入,不过如果用的是Eurker作为注册中心的话,也不用导入,因为Eureka 中已经引用了Ribbon。

    1. org.springframework.cloud
    2. spring-cloud-starter-ribbon

    然后我们需要在启动类里面的方法创建一个负载均衡的RestTemplate Bean

    1. @SpringBootApplication
    2. @EnableDiscoveryClient
    3. public class TestApplicaton {
    4. //创建一个负载均衡的RestTemplate Bean
    5. @LoadBalanced
    6. @Bean
    7. public RestTemplate restTemplate(){
    8. return new RestTemplate();
    9. }
    10. public static void main(String[] args) {
    11. SpringApplication.run(TestApplicaton.class, args);
    12. }
    13. }

    再然后,在要使用的方法里进行引入就可以了。

    1. @Autowired
    2. private RestTemplate restTemp;
    3. public String test(){
    4. //与Eurka集成,将服务注册到Eurka,url中使用注册到Eurka中服务名来进行调用
    5. ResponseEntity rest = restTemp.getForEntity("http://test-service/test/hello" , String.class);
    6. if (rest != null){
    7. return rest.getBody();
    8. }
    9. return null;
    10. }

    2、Feign

    (1)引入pom依赖

    1. org.springframework.cloud
    2. spring-cloud-starter-openfeign

    (2)在启动类上加上 @EnableFeignClients注解

    1. @EnableDiscoveryClient
    2. @SpringBootApplication
    3. @EnableFeignClients
    4. public class TestApplicaton {
    5. public static void main(String[] args) {
    6. SpringApplication.run(TestApplicaton.class, args);
    7. }
    8. }

    (3)新建访问其他微服务的接口

    1. @FeignClient("test-service")
    2. public interface ServiceApi {
    3. @PostMapping("/test/hello")
    4. String hello();
    5. }
    • @FeignClient("test-service")中的“test-service”是spring:application:name,即注册中心中配的应用名,即注册到注册中心里的服务名
    • @PostMapping("/test/hello") 是要调用的微服务的url

    在使用Feign中,我还出现过401的问题,这种情况为没有认证就请求了资源服务器的资源,解决办法为使用Feign的时候把请求的认证信息传递过去,或者资源服务那边开放一些接口。不过开放接口的话情况有点多,所以就选择把token携带过去了。feign提供了一个名为RequestInterceptor得拦截器,可以在请求的时候指定请求头。 

    解决方法就是加一个配置文件, 在请求的时候指定请求头,就可以了。

    1. @Configuration
    2. public class FeignConfig implements RequestInterceptor {
    3. @Override
    4. public void apply(RequestTemplate requestTemplate) {
    5. ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    6. HttpServletRequest request = attributes.getRequest();
    7. requestTemplate.header("Authorization", request.getHeader("Authorization"));
    8. }
    9. }

  • 相关阅读:
    博弈论 之 2 什么是博弈论
    微服务开发平台 Spring Cloud Blade 部署实践
    使用 Docker 部署 Next Terminal 轻量级堡垒机
    L2-020 功夫传人(Python3)
    阿里云代理商:阿里云跨分部抵销前营收267.6亿元,跨分部抵销后营收207.57亿元,抵销后营收环比增长达17.37%。
    [附源码]Python计算机毕业设计Django的连锁药店销售管理系统
    路由策略和路由控制
    深度剖析Gateway在微服务治理中的关键角色
    数学建模【对粒子群算法中惯性权重和学习因子的改进】
    源码构建LAMP环境-1
  • 原文地址:https://blog.csdn.net/wuliang20/article/details/126775891
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号