前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringCloud入门(3)OpenFeign

SpringCloud入门(3)OpenFeign

作者头像
用户8902830
发布2021-08-12 11:04:08
4120
发布2021-08-12 11:04:08
举报
文章被收录于专栏:CodeNone

Feign的目的是为了编写Java客户端变得更加容易,大白话就是可以让我们像平常controller调service一样方便,没有前两篇文章那么繁琐,具体可以看下面的例子。

1 引入OpenFeign

建立一个父open-feign模块,在其模块下再建立一个子feign-server模块,为了导入OpenFeign模块,需要修改父模块的pom文件,其实就是加入了依赖

代码语言:javascript
复制
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

这样就能够把OpenFeign引入,最终的项目结构如下

2 配置文件和主启动类

没有什么特殊情况,服务都是注册进Eureka中,然后再编写自己的端口和服务名称即可。

代码语言:javascript
复制
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8001/eureka/

server:
  port: 8101
spring:
  application:
    name: feign-server
代码语言:javascript
复制
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
//@EnableFeignClients //注意这个注释掉的注解
public class FeignConusme9201 {
    public static void main(String[] args) {
        SpringApplication.run(FeignConusme9201.class, args);
    }
}

这里简单说下@EnableDiscoveryClient@EnableEurekaClient 两个注解的区别,因为服务发现一般会有Eureka、Consul和Zookeeper三种实现。如果使用Eureka做服务注册和服务发现中心,推荐用后者;如果是其它注册中心,那么就可以用前者。

3 业务类

  1. service
代码语言:javascript
复制
  @FeignClient(value = "eureka-provide")
  public interface FeignService {
      @GetMapping(value = "/eureka/provide")
      String consume();
  }

@GetMapping 中的值就是请求服务的地址,@FeignClient 注解里面的value同样也是name,还是重复同样一句话,这个值就是「需要调用的服务端的配置文件中的springcloud.application.name 的值」 ,对于@FeignClient 注解,大概有以下几个属性,大部分都可以顾名思义,以后可能会详细介绍。

  1. controller
代码语言:javascript
复制
  @RestController
  public class FeignController {
  
      FeignService feignService;
  
      public FeignController(FeignService feignService) {
          this.feignService = feignService;
      }
  
      @GetMapping(value = "/feign/consume")
      public String consume() {
          return feignService.consume();
      }
  
  }

直接就很简单,和之前写的普通项目一样,相比之前少写了注入RestTemplate ,然后调用网址返回结果等。

4 测试

其它的不用动,直接开启FeignConsume9201服务即可。如果内存不够的话,只需要开启服务注册中心EurekaServer8001 、服务提供者EurekaProvide7001 和服务消费者FeignConsume9201

接着就是访问http://localhost:9201/feign/consume ,看能不能正确的调用服务提供端。可以看到是能够正常调用服务提供端的。

注意,当一个项目中存在多个接口使用@FeignClient调用同一个服务,意思是说一个服务只能用@FeignClient 使用一次。

此时可以按照提示在配置文件中设置spring.main.allow-bean-definition-overriding=true

5 服务降级

服务降级其实是后面的内容,这里也提一下,因为OpenFiegn其实集成了蛮多东西的。顺便简单说下服务降级的概念,就是当服务不可用的时候,真实情况下是不可能直接崩掉或者直接报错,都会有一个备用方案。

更改service代码

代码语言:javascript
复制
@FeignClient(value = "eureka-provide", fallback = FeignServiceFullbackImpl.class)
public interface FeignService {
    @GetMapping(value = "/eureka/provide")
    String consume();
}

fullback 属性就是服务降级的类,这个类是需要实现这个FeignService这个接口的

代码语言:javascript
复制
public class FeignServiceFullbackImpl implements FeignService {
    @Override
    public String consume() {
        return "服务降级"; 
    }
}

为了模拟服务降级的场景,只需要开启EurekaServer8001 服务注册发现中心,并且开启FeignConsume9201 ,至于其它的服务提供者则不需要开启。

但是,如果仅仅如此,肯定是会报错的,因为是有服务降级的思想,但是没有落实到实处,所以需要在配置文件中打开Hystrix ,这个组件到后面会详细讲。并且,实现类需要注册进Spring才能在降级的时候被发现。

代码语言:javascript
复制
feign:
  hystrix:
    enabled: true
代码语言:javascript
复制
@Component //添加一个注解
public class FeignServiceFullbackImpl implements FeignService {
    //省略
}

同样还是访问http://localhost:9201/feign/consume,可以看到已经降级了

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CodeNone 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 引入OpenFeign
  • 2 配置文件和主启动类
  • 3 业务类
  • 4 测试
  • 5 服务降级
相关产品与服务
微服务引擎 TSE
微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档