作者:微信小助手
发布时间:2021-09-14T12:10:02
前面介绍了Spring Cloud 中的灵魂摆渡者 今天介绍一款服务调用的组件: 文章目录如下: Feign也是一个狠角色,Feign旨在使得Java Http客户端变得更容易。 Feign集成了Ribbon、RestTemplate实现了负载均衡的执行Http调用,只不过对原有的方式(Ribbon+RestTemplate)进行了封装,开发者不必手动使用RestTemplate调服务,而是定义一个接口,在这个接口中标注一个注解即可完成服务调用,这样更加符合面向接口编程的宗旨,简化了开发。 但遗憾的是Feign现在停止迭代了,当然现在也是有不少企业在用。 有想要学习Feign的读者可以上spring Cloud官网学习,陈某这里也不再详细介绍了,不是今天的重点。 前面介绍过停止迭代的Feign,简单点来说:OpenFeign是springcloud在Feign的基础上支持了SpringMVC的注解,如 官网地址:https://docs.spring.io/spring-cloud-openfeign/docs/2.2.10.BUILD-SNAPSHOT/reference/html 本篇文章Spring Cloud版本、JDK环境、项目环境均和上一篇Nacos的环境相同:五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强?。 注册中心就不再使用 本篇文章搭建的项目结构如下图: 注册中心使用Nacos,创建个微服务,分别为服务提供者Produce,服务消费者Consumer。 既然是微服务之间的相互调用,那么一定会有服务提供者了,创建 注意:此处的 项目源码都会上传,关于如何注册进入Nacos,添加什么依赖源码都会有,结合陈某上篇Nacos文章,这都不是难事! 新建一个模块 除了Nacos的注册中心的依赖,还要添加openFeign的依赖,如下: 老套路了,在Spring boot 主启动类上添加一个注解 新建一个openFeign接口,使用 注意:该注解 新建一个controller用来调试接口,直接调用openFeign的接口,如下: 好了,至此一个openFeign的微服务就搭建好了,并未实现具体的功能,下面一点点实现。 开发中接口传参的方式有很多,但是在openFeign中的传参是有一定规则的,下面详细介绍。 这个也是接口开发中常用的传参规则,在Spring Boot 中通过 provider接口中JSON传参方法如下: consumer中openFeign接口中传参代码如下: 注意: 这种传参方式也是比较常用,参数使用POJO对象接收。 provider服务提供者代码如下: consumer消费者openFeign代码如下: 网上很多人疑惑POJO表单方式如何传参,官方文档明确给出了解决方案,如下: openFeign提供了一个注解 此种方式针对restful方式中的GET请求,也是比较常用请求方式。 provider服务提供者代码如下: consumer消费者openFeign接口如下: 使用注解 此种方式传参不建议使用,但是也有很多开发在用。 provider服务提供者代码如下: consumer消费者openFeign接口传参如下:1、前言
Nacos
,和它的前辈们相比不仅仅功能强大,而且部署非常简单。OpenFeign
,同样是一款超越先辈(Ribbon
、Feign
)的狠角色。
2、Feign是什么?
3、openFeign是什么?
@RequestMapping
等等。OpenFeign的@FeignClient
可以解析SpringMVC的@RequestMapping
注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
4、Feign和openFeign有什么区别?
Feign
openFiegn
Feign是SpringCloud组件中一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务
OpenFeign 是SpringCloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等。OpenFeign 的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
5、环境准备
Eureka
了,直接使用Nacos
作为注册和配置中心,有不会的可以查看Nacos文章。
6、创建服务提供者
openFeign-provider9005
,注册进入Nacos中,配置如下:server:
port: 9005
spring:
application:
## 指定服务名称,在nacos中的名字
name: openFeign-provider
cloud:
nacos:
discovery:
# nacos的服务地址,nacos-server中IP地址:端口号
server-addr: 127.0.0.1:8848
management:
endpoints:
web:
exposure:
## yml文件中存在特殊字符,必须用单引号包含,否则启动报错
include: '*'spring.application.name
指定的名称将会在openFeign接口调用中使用。
7、创建服务消费者
openFeign-consumer9006
作为消费者服务,步骤如下。1、添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>2、添加注解@EnableFeignClients开启openFeign功能
@EnableFeignClients
,开启openFeign功能,如下:@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OpenFeignConsumer9006Application
{
public static void main(String[] args) {
SpringApplication.run(OpenFeignConsumer9006Application.class, args);
}
}3、新建openFeign接口
@FeignClient
注解标注,如下:@FeignClient(value = "openFeign-provider")
public interface OpenFeignService {
}
@FeignClient
中的value
属性指定了服务提供者在nacos注册中心的服务名。4、新建一个Controller调试
@RestController
@RequestMapping("/openfeign")
public class OpenFeignController {
}8、openFeign如何传参?
1、传递JSON数据
@RequestBody
标识入参。@RestController
@RequestMapping("/openfeign/provider")
public class OpenFeignProviderController {
@PostMapping("/order2")
public Order createOrder2(@RequestBody Order order){
return order;
}
}@FeignClient(value = "openFeign-provider")
public interface OpenFeignService {
/**
* 参数默认是@RequestBody标注的,这里的@RequestBody可以不填
* 方法名称任意
*/
@PostMapping("/openfeign/provider/order2")
Order createOrder2(@RequestBody Order order);
}openFeign
默认的传参方式就是JSON传参(@RequestBody
),因此定义接口的时候可以不用@RequestBody
注解标注,不过为了规范,一般都填上。2、POJO表单传参
@RestController
@RequestMapping("/openfeign/provider")
public class OpenFeignProviderController {
@PostMapping("/order1")
public Order createOrder1(Order order){
return order;
}
}@FeignClient(value = "openFeign-provider")
public interface OpenFeignService {
/**
* 参数默认是@RequestBody标注的,如果通过POJO表单传参的,使用@SpringQueryMap标注
*/
@PostMapping("/openfeign/provider/order1")
Order createOrder1(@SpringQueryMap Order order);
}
@SpringQueryMap
完美解决POJO表单传参。3、URL中携带参数
@RestController
@RequestMapping("/openfeign/provider")
public class OpenFeignProviderController {
@GetMapping("/test/{id}")
public String test(@PathVariable("id")Integer id){
return "accept one msg id="+id;
}@FeignClient(value = "openFeign-provider")
public interface OpenFeignService {
@GetMapping("/openfeign/provider/test/{id}")
String get(@PathVariable("id")Integer id);
}@PathVariable
接收url中的占位符,这种方式很好理解。4、普通表单参数
@RestController
@RequestMapping("/openfeign/provider")
public class OpenFeignProviderController {
@PostMapping("/test2")
public String test2(String id,String name){
return MessageFormat.format("accept on msg id={0},name={1}",id,name);
}
}@FeignClient(value = "openFeign-provider")
public interface OpenFeignService {
/**
* 必须要@RequestParam注解标注,且value属性必须填上参数名
* 方法参数名可以任意,但是@RequestParam<