关于springcloud:SpringCloud之使用Feign跨服务调用最佳方式

37次阅读

共计 2076 个字符,预计需要花费 6 分钟才能阅读完成。

前言

最近在学习如何应用 springcloud,当学习到跨服务调用接口时接触到 Feign 和 Ribbon,网上有好多文章是介绍他们俩的区别的,有趣味的能够看看,本文次要举荐应用 Feign 并记录操作过程。

Feign 和 Ribbon 比照

Ribbon
Ribbon 是一个基于 HTTP 和 TCP 客户端的负载均衡器
它能够在客户端配置 ribbonServerList(服务端列表),而后轮询申请以实现平衡负载
它在联结 Eureka 应用时
ribbonServerList 会被 DiscoveryEnabledNIWSServerList 重写,扩大成从 Eureka 注册核心获取服务端列表
同时它也会用 NIWSDiscoveryPing 来取代 IPing,它将职责委托给 Eureka 来确定服务端是否曾经启动

Feign
Spring Cloud Netflix 的微服务都是以 HTTP 接口的模式裸露的,所以能够用 Apache 的 HttpClient 或 Spring 的 RestTemplate 去調用
而 Feign 是一個应用起來更加不便的 HTTP 客戶端
总结起来就是:公布到注册核心的服务方接口,是 HTTP 的,也能够不必 Ribbon 或者 Feign,间接浏览器一样可能拜访
只不过 Ribbon 或者 Feign 调用起来要不便一些,最重要的是:它俩都反对软负载平衡
留神:spring-cloud-starter-feign 外面曾经蕴含了 spring-cloud-starter-ribbon(Feign 中也应用了 Ribbon)
从实际上看,采纳 feign 的形式更优雅(feign 外部也应用了 ribbon 做负载平衡)。

操作

1、引入 feign 依赖包

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、启用 feign:@EnableFeignClients

@SpringBootApplication
// 资源爱护服务
@EnableResourceServer
// 服务发现
@EnableDiscoveryClient
// 启用 feign
@EnableFeignClients
@RefreshScope
public class NofityServiceApplication {
    @Bean
    public BCryptPasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();
    }

    public static void main(String[] args) {SpringApplication.run(NofityServiceApplication.class, args);
    }
}

3、配置 feign 传递 token

@Configuration
public class FeignConfig implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        String authorization = request.getHeader("authorization");
        log.info("--- authorization ---:{}", authorization);
        if (authorization != null) {log.info("---- set authorization ---");
            // 增加 token
            requestTemplate.header("authorization", authorization);
        }
    }
}

4、应用 feign 调用其它微服务接口

新建 AccountFeignClient.java 文件

@FeignClient("account-service")
public interface AccountFeignClient {@GetMapping("/userInfo/{userName}")
    User getAccountInfoByUserName(@PathVariable("userName") String userName);
}

这样就实现了 feign 配置的所有操作,试试调用是不是 OK 了!

总结

1、feign 跨服务调用的时候会有 token 的传递,所以肯定要加上下面的 config 配置
2、如果被调用的服务接口不须要 token,如果你调用的接口传递了 token 会报 401,这个要留神一下!

援用

SpringCloud 系列之服务生产 Ribbon 和 Feign 区别

正文完
 0