软件编程
位置:首页>> 软件编程>> java编程>> Spring Cloud详解实现声明式微服务调用OpenFeign方法

Spring Cloud详解实现声明式微服务调用OpenFeign方法

作者:_时光煮雨  发布时间:2021-07-04 07:56:41 

标签:Spring,Cloud,声明式,微服务,OpenFeign

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: '%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n'

编写启动类

@EnableDiscoveryClient
@EnableFeignClients
@EnableEurekaClient
@SpringBootApplication
public class DmsApplication {
   public static void main(String[] args) {
       SpringApplication.run(DmsApplication.class, args);
   }
}

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

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

@FeignClient(value = "dms")
public interface DmsApi {
   @RequestMapping(value="/dict/[code]", method = RequestMethod.GET)
   public String findNameByCode(@PathVariable("code") String code);
}

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

@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()方法,即可完成服务的调用代码!

@RestController
public class AppController {
   @Autowired
   private DmsApi dmsApi;
   @RequestMapping("/index")
   public String index(){
       String nameByCode = dmsApi.findNameByCode("1");
       return nameByCode;
   }
}

启动类

@EnableEurekaClient
@SpringBootApplication
public class AppApplication {
   public static void main(String[] args) {
       SpringApplication.run(AppApplication.class, args);
   }
}

启动项目验证

Spring Cloud详解实现声明式微服务调用OpenFeign方法

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

来源:https://blog.csdn.net/A598853607/article/details/125381989

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com