微服务实战|声明式服务调用openfeign实践(代码片段)

_时光煮雨 _时光煮雨     2022-10-20     427

关键词:

上一篇 微服务实战|负载均衡组件及源码分析

文章目录

OpenFeign介绍

一开始,我们使用原生的 DiscoveryClient 发现服务和使用RestTemplate进行服务间调用,然后我们自己手动开发了一个负载均衡组件,最后介绍了负载均衡组件Ribbon。每个章节调用服务的方式也有所不同,共同点则是都是基于RestTemplate 来实现的,想必大家都会觉得这样的调用方式有点麻烦,每次调用前都要写请求协议,服务名称,接口名称、组装参数、处理响应数据类型,这些都是一些重复的工作,代码也都高度相似,每次请求只有 URL 不同,请求方法不同、参数不同,其它东西基本都是一样的,既然如此,那有没有办法简化请求呢?本文我们要聊的声明式微服务调用OpenFeign 。

OpenFeign是一个显示声明式的WebService客户端。使用OpenFeign能让编写Web Service客户端更加简单。使用时只需定义服务接口,然后在上面添加注解。OpenFeign也支持可拔插式的编码和解码器。spring cloud对feign进行了封装,使其支持MVC注解和HttpMessageConverts。和eureka(服务注册中心)和ribbon组合可以实现负载均衡。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求,非常的方便

  • OpenFeign的设计宗旨式简化Java Http客户端的开发。Feign在restTemplate的基础上做了进一步的封装,由其来帮助我们定义和实现依赖服务接口的定义。在OpenFeign的协助下,我们只需创建一个接口并使用注解的方式进行配置(类似于Dao接口上面的Mapper注解)即可完成对服务提供方的接口绑定,大大简化了Spring cloud Ribbon的开发,自动封装服务调用客户端的开发量。
  • OpenFeign集成了Ribbon,利用ribbon维护了服务列表,并且通过ribbon实现了客户端的负载均衡。与ribbon不同的是,通过OpenFeign只需要定义服务绑定接口且以申明式的方法,优雅而简单的实现了服务调用。

项目实战

创建项目

接下来,就开始我们的项目实战,创建两个服务,一个是dms(就是码表服务,提供各种下拉选项列表),一个是应用系统app(实际的业务系统)

首先创建名为dms的maven项目,引入依赖

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

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

    </dependencies>

创建配置文件:

server:
  port: 8003
spring:
  application:
    name: dms

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8001/eureka/

logging:
  pattern:
    console: '%dyyyy-MM-dd HH:mm:ss.SSS %-5level [%thread] %logger15 - %msg%n'

编写启动类

/**
 * @Author:公众号:程序员965
 * @create 2022-06-20
 **/
@EnableDiscoveryClient
@EnableFeignClients
@EnableEurekaClient
@SpringBootApplication
public class DmsApplication 
    public static void main(String[] args) 
        SpringApplication.run(DmsApplication.class, args);
    

注意此时,我们在启动类上面增加了@EnableFeignClients@EnableDiscoveryClient注解。

编写api模块代码,注意这是一个接口对外提供服务,接口的服务名称是dms,根据code代码值获取名称:

/**
 * @Author:公众号:程序员965
 * @create 2022-06-20
 **/
@FeignClient(value = "dms")
public interface DmsApi 
    @RequestMapping(value="/dict/code", method = RequestMethod.GET)
    public String findNameByCode(@PathVariable("code") String code);

编写controller类,可以实现DmsApi接口,这里简单以性别举例:

/**
 * @Author:公众号:程序员965
 * @create 2022-06-20
 **/
@RestController
public class DmsController implements DmsApi 

    @Override
    public String findNameByCode(String code) 
        switch (code)
            case "0" :
                return "男";
            case "1" :
                return "女";
            default:
                return "未知";
        
    

dms模块就开发完毕了。

同样的,创建app模块,注意需要引入dms模块,以便调用其接口

<dependencies>

        <dependency>
            <groupId>com.cxy965</groupId>
            <artifactId>dms</artifactId>
            <version>$project.version</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <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-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </dependency>

    </dependencies>

创建controller层:在此注入dmsApi,并通过dmsApi调用其findNameByCode()方法,即可完成服务的调用代码!

/**
 * @Author:公众号:程序员965
 * @create 2022-06-20
 **/
@RestController
public class AppController 
    @Autowired
    private DmsApi dmsApi;

    @RequestMapping("/index")
    public String index()
        String nameByCode = dmsApi.findNameByCode("1");
        return nameByCode;
    


启动类

/**
 * @Author:公众号:程序员965
 * @create 2022-06-20
 **/
@EnableEurekaClient
@SpringBootApplication
public class AppApplication 
    public static void main(String[] args) 
        SpringApplication.run(AppApplication.class, args);
    

启动项目验证

返回了正确的结果,当注册中心有多个dms服务时,调用时会自动起到负载均衡的作用。

总结

OpenFeign 是 Spring Cloud 家族的一个成员, 它最核心的作用是为 HTTP 形式的 Rest API 提供了非常简洁高效的 RPC 调用方式。 如果说 Spring Cloud 其他成员解决的是系统级别的可用性,扩展性问题, 那么 OpenFeign 解决的则是与开发人员利益最为紧密的开发效率问题。这篇文章中我们学会了Feign组件的集成和基础使用,下一篇文章将写一下Feign的更多用法,一起期待吧!

CSDN 社区图书馆,开张营业! 深读计划,写书评领图书福利~

chrisrichardson微服务实战系列

微服务实战(一):微服务架构的优势与不足微服务实战(二):使用APIGateway微服务实战(三):深入微服务架构的进程间通信微服务实战(四):服务发现的可行方案以及实践案例微服务实践(五):微服务的事件驱动数据... 查看详情

微服务实战:选择微服务部署策略

 微服务实战(一):微服务架构的优势与不足微服务实战(二):使用APIGateway微服务实战(三):深入微服务架构的进程间通信微服务实战(四):服务发现的可行方案以及实践案例微服务实践(五):微服务的事件驱动... 查看详情

微服务实践:微服务的事件驱动数据管理

 微服务实战(一):微服务架构的优势与不足微服务实战(二):使用APIGateway微服务实战(三):深入微服务架构的进程间通信微服务实战(四):服务发现的可行方案以及实践案例微服务实践(五):微服务的事件驱动... 查看详情

微服务实战:服务发现的可行方案以及实践案例

   微服务实战(四):服务发现的可行方案以及实践案例这是关于使用微服务架构创建应用系列的第四篇文章。第一篇介绍了微服务架构的模式,讨论了使用微服务架构的优缺点。第二和第三篇描述了微服务架构内部... 查看详情

微服务实战:服务发现的可行方案以及实践案例

这是关于使用微服务架构创建应用系列的第四篇文章。第一篇介绍了微服务架构的模式,讨论了使用微服务架构的优缺点。第二和第三篇描述了微服务架构内部的通讯机制。这篇文章中,我们将会探讨服务发现相关问题。为什么... 查看详情

微服务实战:选择微服务部署策略

...应用实例。部署单体式应用不会很直接,但是肯定比部署微服务应用简单些。一个微服务应用由上百个服务构成,服务可以采用不同语言和框架分别写就。每个服务都是一个单一应用,可以有自己的部署、资源、扩展和监控需求... 查看详情

微服务实战:服务发现的可行方案以及实践案例

这是关于使用微服务架构创建应用系列的第四篇文章。第一篇介绍了微服务架构的模式,讨论了使用微服务架构的优缺点。第二和第三篇描述了微服务架构内部的通讯机制。这篇文章中,我们将会探讨服务发现相关问题。为什么... 查看详情

微服务实战:深入微服务架构的进程间通信

【编者的话】这是采用微服务架构创建自己应用系列第三篇文章。第一篇介绍了微服务架构模式,和单体式模式进行了比较,并且讨论了使用微服务架构的优缺点。第二篇描述了采用微服务架构应用客户端之间如何采用APIGateway... 查看详情

微服务实战:深入微服务架构的进程间通信

【编者的话】这是采用微服务架构创建自己应用系列第三篇文章。第一篇介绍了微服务架构模式,和单体式模式进行了比较,并且讨论了使用微服务架构的优缺点。第二篇描述了采用微服务架构应用客户端之间如何采用APIGateway... 查看详情

微服务实战:深入微服务架构的进程间通信

    微服务实战(三):深入微服务架构的进程间通信【编者的话】这是采用微服务架构创建自己应用系列第三篇文章。第一篇介绍了微服务架构模式,和单体式模式进行了比较,并且讨论了使用微服务架构的优缺... 查看详情

springcloudalibaba微服务实战二十二-整合dubbo

概述在SpringCloud构建的微服务系统中,大多数的开发者使用都是官方提供的Feign组件来进行内部服务通信,这种声明式的HTTP客户端使用起来非常的简洁、方便、优雅,但是有一点,在使用Feign消费服务的时候,相比较Dubbo这种RPC框... 查看详情

基于springcloud的微服务实战

1引言1.1目的本博文是基于springboot+springcloud实现的微服务架构改造,提供对研发人员的技术架构支持。版本0.0.1主要实现了四个模块的功能:服务生产者,服务消费者,服务注册中心,客户端负载均衡。后续还会根据项目进展进... 查看详情

汇总

...loudalibaba系列教程了,推荐给大家!SpringCloudAlibaba微服务实战一-基础环境准备SpringCloudAlibaba微服务实战二-服务注册SpringCloudAlibaba微服务实战三-服务调用SpringCloudAlibaba微服务实战四-版本管理SpringCloudA 查看详情

汇总

...loudalibaba系列教程了,推荐给大家!SpringCloudAlibaba微服务实战一-基础环境准备SpringCloudAlibaba微服务实战二-服务注册SpringCloudAlibaba微服务实战三-服务调用SpringCloudAlibaba微服务实战四-版本管理SpringCloudA 查看详情

3.16go微服务实战(微服务理论)---go语言基于es-cqrs的微服务实践

第18章 Go语言基于ES-CQRS的微服务实践18.1 理论介绍 18.1.1 事件溯源 指的是将每次的事件都记录下来,而不是去记录对象的状态。只能追加,不能对已经添加的事件做修改。 18.1.2 命令查询职责分离 1.命令 不返回任何结果... 查看详情

3.16go微服务实战(微服务理论)---go语言基于es-cqrs的微服务实践

第18章 Go语言基于ES-CQRS的微服务实践18.1 理论介绍 18.1.1 事件溯源 指的是将每次的事件都记录下来,而不是去记录对象的状态。只能追加,不能对已经添加的事件做修改。 18.1.2 命令查询职责分离 1.命令 不返回任何结果... 查看详情

springcloud微服务实战

...置RestTemplate:DiscoveryClient:支持Ribbon的RestTemplate:Feign:OpenFeign依赖:Feign会在运行时动态生 查看详情

3.20go微服务实战(微服务实战)---日志和监控

第20章 日志和监控20.1 日志实践20.2 指标 20.2.1 指标数据类型 20.2.2 命名约定 20.2.3 存储和查询 20.2.4 Grafana20.3 日志记录 20.3.1 具有关联ID的分布式跟踪 20.3.2 ElasticSearch、Logstash和Kibana 20.3.3 Kibana 20.4 异常    查看详情