SpringCloud系列之 openfeign

摘要:
Springcloud eureka服务器是注册表Springcloud-openfeign-a:服务调用端Aspringcloud-openfegn-b:服务调用方b项目用于创建eureka服务注册表,提供服务注册和发现,创建新的springboot项目Springcloud-euroka服务器,并导入pom依赖项:org.springframework.cloudspringfloudstarter netflix Eureka server˂groupId=org.springfframework.boot注释启动类:@EnableEureka server编写配置文件应用程序。yml:服务器:端口:2222eureka:实例:主机名:local主机的实例名#eureka服务器客户端:#false表示您没有在注册表中注册自己-使用-eureka:false#false表示服务器是注册表,您的责任是维护服务实例,不需要检索服务获取注册表:false service url:#将与eureka Server交互的地址查询服务和注册服务设置为依赖此地址defaultZone:http://${eureka.instance.hostname}:${Server.port}/eureka/创建一个新的SpringBoot项目,服务调用end springcloud-openfeign-a,并导入pom文件:<dependency><groupId>org。弹簧框架。cloud春季云启动器netflix eureka客户端org。弹簧框架。启动spring-starter web˂!

简介

openfeign 是一个服务调用的组件,用来实现两个服务之间的相互调用,Feign是一个声明式的Web服务客户端,让编写Web服务客户端变得非常容易,只需创建一个接口并在接口上申明注解。使用起来比传统的RestTemplate 更加简单。

使用

使用前阅读

由于openfeign 是只是服务调用,需要注册中心的先注册服务在可以被调用,本文注册中心使用的是eureka,当然也可以使用其它的注册中心,有兴趣的可以自行创建。
openfeign的使用方法很简单,只需要简答的配置就可以实现服务之间的调用,使用起来和传统的单体项目很相似,但是一般使用的过程中,openfeign要和 hystrix 一起使用,可以实现更加丰富的功能,本文主要是对openfeign 进行简单的使用。
springcloud-eureka-server 为注册中心
springcloud-openfeign-a: 服务调用端A
springcloud-openfeign-b: 服务调用端B

项目中使用

创建eureka服务注册中心,提供服务注册和发现,新建springBoot项目springcloud-eureka-server,并导入pom依赖:

         <!-- eureka-server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

在启动类类上加注解:

@EnableEurekaServer

编写配置文件application.yml:

server:
  port: 2222

eureka:
  instance:
    hostname: localhost  #eureka服务端的实例名称
  client:
    #false表示不向注册中心注册自己(想注册也可以,不过没必要)
    register-with-eureka: false
    #false表示自己端就是注册中心,职责就是维护服务实例,并不需要去检索服务
    fetch-registry: false
    service-url:
      #设置与eurekaServer交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

新建SpringBoot项目,服务调用端springcloud-openfeign-a,并导入pom文件:


        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- openfeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--工具包-->
        <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.5.4</version>
        </dependency>

启动类上加注解

@EnableEurekaClient
@EnableFeignClients //开启Feign

编写测试用例DemoController:


@RestController
@RequestMapping("/demo")
public class DemoController {

    @Value("${server.port}")
    private String serverPort;
    @Value("${spring.application.name}")
    private String serverName;

    @Autowired
    BOpenFeignService bOpenFeignService;


    @GetMapping("/getServerInfo/{name}")
    public String getServerInfo(@PathVariable("name") String name) {
        if (StrUtil.isBlank(name)) {
            return "请输入请求数据!";
        }
        String result = "当前服务器:" + serverName + " 端口号:" + serverPort + " 时间戳:" + DateUtil.now();
        ;
        if (!"a".equalsIgnoreCase(name)) {
            result += "<br>目标服务器:<br>" + bOpenFeignService.getServerInfo(name);
        }
        return result;
    }

    @GetMapping("/test/threadSleep/{seconds}")
    public String threadSleep(@PathVariable("seconds")Long seconds){
        try {
            TimeUnit.SECONDS.sleep(seconds);
        }catch (Exception e){
            e.printStackTrace();
        }
        return "执行完成!";
    }
}

编写openfeign 的服务调用service:

@Component
@FeignClient(value = "SPRINGCLOUD-OPENFEIGN-B")  //value是另一个项目的服务名
public interface BOpenFeignService {

    @GetMapping("/demo/getServerInfo/{name}")
    @ResponseBody
    public String getServerInfo(@PathVariable("name") String name);
}

编写配置文件application.yml:

server:
  port: 3333
spring:
  application:
    name: springcloud-openfeign-a
eureka:
  client:
    #true表示向注册中心注册自己,默认为true
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:2222/eureka

新建SpringBoot项目,服务调用端springcloud-openfeign-b,并导入pom文件:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- openfeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--工具包-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.5.4</version>
        </dependency>

启动类上加注解

@EnableEurekaClient
@EnableFeignClients //开启Feign

编写测试用例DemoController:


@RestController
@RequestMapping("/demo")
public class DemoController {

    @Value("${server.port}")
    private String serverPort;
    @Value("${spring.application.name}")
    private String serverName;

    @Autowired
    AOpenFeignService aOpenFeignService;
    
    @GetMapping("/getServerInfo/{name}")
    public String getServerInfo(@PathVariable("name") String name) {
        if (StrUtil.isBlank(name)) {
            return "请输入请求数据!";
        }
        String result = "当前服务器:" + serverName + " 端口号:" + serverPort + " 时间戳:" + DateUtil.now();
        ;
        if (!"b".equalsIgnoreCase(name)) {
            result += "<br>目标服务器:<br>" + aOpenFeignService.getServerInfo(name);
        }
        return result;
    }

    @GetMapping("/test/threadSleep/{seconds}")
    public String threadSleep(@PathVariable("seconds") Long seconds){
        return aOpenFeignService.threadSleep(seconds);
    }
}

编写openfeign 的服务调用service:

@Component
@FeignClient(value = "SPRINGCLOUD-OPENFEIGN-A")
public interface AOpenFeignService {

    @GetMapping("/demo/getServerInfo/{name}")
    @ResponseBody
    public String getServerInfo(@PathVariable("name") String name);

    @GetMapping("/demo/test/threadSleep/{seconds}")
    public String threadSleep(@PathVariable("seconds") Long seconds);
}

编写配置文件application.yml:

server:
  port: 5555
spring:
  application:
    name: springcloud-openfeign-b
eureka:
  client:
    #true表示向注册中心注册自己,默认为true
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:2222/eureka
feign:
  client:
    config:
      default:
        #建立连接所用的时间,适用于网络状况正常的情况下,两端连接所需要的时间
        ConnectTimeOut: 5000
        #指建立连接后从服务端读取到可用资源所用的时间
        ReadTimeOut: 5000

启动项目

依次启动项目

springcloud-eureka-server ,springcloud-openfeign-a,springcloud-openfeign-b

检测注册中心是否有服务

访问:

http://127.0.0.1:2222/

如下图,可以看到两个服务已经被注册进来了
SpringCloud系列之 openfeign第1张

a 调用 a:

http://127.0.0.1:3333/demo/getServerInfo/a

SpringCloud系列之 openfeign第2张

a 调用 b:

http://127.0.0.1:3333/demo/getServerInfo/b

SpringCloud系列之 openfeign第3张

b 调用 a 发生超时:

http://127.0.0.1:5555/demo/test/threadSleep/6

SpringCloud系列之 openfeign第4张

springcloud-openfeign-b 中加入 openfeign超时配置application.yml:

feign:
  client:
    config:
      default:
        #建立连接所用的时间,适用于网络状况正常的情况下,两端连接所需要的时间
        ConnectTimeOut: 7000
        #指建立连接后从服务端读取到可用资源所用的时间
        ReadTimeOut: 7000

再次调用:

http://127.0.0.1:5555/demo/test/threadSleep/5

SpringCloud系列之 openfeign第5张

项目地址

git@gitee.com:anxc/study-demo.git

参考链接

https://www.jianshu.com/p/e1561b45a6b2
https://github.com/OpenFeign/
https://www.cnblogs.com/my-ordinary/p/12508997.html

免责声明:文章转载自《SpringCloud系列之 openfeign》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇STC89C52单片机定时器2整理一个研发团队是如何坚持7年技术分享的?下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

跟着我一步一步的搭建一个基于springcloud的微服务实例

Table of Contentsgenerated with DocToc microservicecloud 插件推荐 建立父工程Microservicecloud 搭建Employ员工服务创建数据库 创建消费者服务microservicecloud-employconsummer Eureka注册中心搭建 单机模式创建microserv...

【Eureka】服务端和客户端

【Eureka】服务端和客户端 转载:https://www.cnblogs.com/yangchongxing/p/10778357.html Eureka服务端 1、添加依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/P...

详解Eureka 缓存机制

原文:https://www.cnblogs.com/yixinjishu/p/10871243.html 引言 Eureka是Netflix开源的、用于实现服务注册和发现的服务。Spring Cloud Eureka基于Eureka进行二次封装,增加了更人性化的UI,使用更为方便。但是由于Eureka本身存在较多缓存,服务状态更新滞后,最常见的状况是:服...

apolloJava客户端的使用

参考携程官网提供的https://github.com/ctripcorp/apollo/wiki/Java%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97  整个项目组的代码如下  项目的pom.xml代码如下 <project xmlns="http://maven...

SpringBoot2.0+SpringCloud Eureka搭建高可用注册中心(Eureka之二)

上一篇中提到用SpringBoot2.0+Eureka搭建服务注册中心和服务提供者,详情参考: https://www.cnblogs.com/SysoCjs/p/10127448.html         现在讲一下SpringCloud+Eureka搭建高可用注册中心。在微服务架构的分布式环境中,必须充分考虑可能会发生的故障情况,所以生产环境必须对各个...

微服务-服务注册与发现

1.服务注册与发现基础架构 注册中心: 接受服务提供者的注册、存储服务提供者的服务信息 ,比如ip 端口号 服务名这些信息; 并且与微服务保持心跳,如果心跳不能保持则注销该实例。 所以注册中心主要提供服务提供者信息的存储,另外与服务提供者保持心跳以监控服务提供者的存活。 服务提供者: 向注册中心提供服务信息,以及一些健康状态。 服务消费者: 定期向注册中...