前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Cloud 学习笔记(4) 声明式服务调用Feign

Spring Cloud 学习笔记(4) 声明式服务调用Feign

作者头像
张云飞Vir
发布2021-05-17 14:31:35
3940
发布2021-05-17 14:31:35
举报
文章被收录于专栏:写代码和思考

1. 背景

2.知识

Feign 是一个声明式的REST客户端网络请求的框架,类似于 RestTemplate。它整合 了 Ribbon 与 Hystrix, 还提供了一 种声明式的 Web 服务客户端定义方式。也就是自带客户端负载均衡和断路器。

对比于RestTemplate 具有这些特点:

  • 声明式调用更清晰
  • 封装比较好:自带负载均衡和断路器
  • 方便配置

feign 在默认情况下使用 JDK 原生的 URLConnection 发送HTTP请求,也可以配置更换。

使用Feign 要使用Feign,创建一个接口并对其进行注解就行了。

3. 示例

1) 导入依赖包

代码语言:javascript
复制
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
    // 要想让 熔断起效,这里也要引用 netflix-hystrix'
    implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-netflix-hystrix', version: '2.2.8.RELEASE'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

注意:要想看到 断路器 hystrix 效果,一定要加上 spring-cloud-starter-netflix-hystrix 依赖。原因是,虽然feign可以附加断路器的实现fallback处理,但缺少hystrix包,我在这里卡了好久。切记要加上

2) 导入

写一个 feign 的客户端调用类,它用 注解声明的方式来调用 远程服务。

代码语言:javascript
复制
@FeignClient(value = "HELLO-SERVICE-1", fallbackFactory = TestFallbackFactory.class)
public interface HelloClient {

    @RequestMapping(method = RequestMethod.GET, value = "/hello")
    String hello();

}

其中: HELLO-SERVICE-1 是 远程服务 的名称。 /hello 指向了访问的URL。主要参数也要一致。

3) 断路器 fallback 的实现

当发生超时,远程服务不可用等情形,就要出发 服务降级。我们加上一个 fallback 的降级处理方法。注解这么写 fallbackFactory = TestFallbackFactory.class

代码如下:

代码语言:javascript
复制
@Component
public class TestFallbackFactory implements FallbackFactory<HelloClient> {
    private static final Logger logger = LoggerFactory.getLogger(DemoApplication.class);

    @Override
    public HelloClient create(Throwable cause) {
        logger.info("**********");
        cause.printStackTrace();

        return new MyFallback();
    }

}


public class MyFallback implements HelloClient {
    @Override
    public String hello() {
        //throw new NoFallbackAvailableException("Boom!", new RuntimeException());
        return "出错了";
    }
}

4) 配置中开启 断路器

关键的是要在配置文件中写“ feign.circuitbreaker.enabled=true ”,将断路器开启。

代码语言:javascript
复制
server.port=9001
spring.application.name=consumer
eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/

feign.circuitbreaker.enabled=true

#hystrix.command.default.execution.isolation.thread.timeoutinMilliseconds=2OOO

上面的负载均衡器客户机将希望发现“stores”服务的物理地址

4. 扩展

我的代码示例:https://github.com/vir56k/demo/tree/master/springboot/feign_demo

5.参考:

《Spring Cloud微服务实战》 https://zhuanlan.zhihu.com/p/149693905?from_voters_page=true https://spring.io/projects/spring-cloud-openfeign

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 背景
  • 2.知识
  • 3. 示例
    • 1) 导入依赖包
      • 2) 导入
        • 3) 断路器 fallback 的实现
          • 4) 配置中开启 断路器
          • 4. 扩展
          • 5.参考:
          相关产品与服务
          负载均衡
          负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档