springcloud Feign的使用用法以及与RestTemplate的区别
微服务之间的通信方式
常见的方式有两种:
- RPC——代表-dubbo
- HTTP——代表-SpringCloud
在SpringCloud中,默认是使用http来进行微服务的通信,最常用的实现形式有两种:
- RestTemplate
- Feign
Feign跟RestTemplate的区别
-
请求方式不一样
RestTemplate需要每个请求都拼接url+参数+类文件,灵活性高但是消息封装臃肿。
feign可以伪装成类似SpringMVC的controller一样,将rest的请求进行隐藏,不用再自己拼接url和参数,可以便捷优雅地调用HTTP API。 -
底层实现方式不一样
RestTemplate在拼接url的时候,可以直接指定ip地址+端口号,不需要经过服务注册中心就可以直接请求接口;也可以指定服务名,请求先到服务注册中心(如nacos)获取对应服务的ip地址+端口号,然后经过HTTP转发请求到对应的服务接口(注意:这时候的restTemplate需要添加@LoadBalanced注解,进行负载均衡)。
Feign的底层实现是动态代理,如果对某个接口进行了@FeignClient注解的声明,Feign就会针对这个接口创建一个动态代理的对象,在调用这个接口的时候,其实就是调用这个接口的代理对象,代理对象根据@FeignClient注解中name的值在服务注册中心找到对应的服务,然后再根据@RequestMapping等其他注解的映射路径构造出请求的地址,针对这个地址,再从本地实现HTTP的远程调用。
Feign的使用方法以及springcloud依赖
第一步 导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<--解决负载均衡-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>3.0.3</version>
</dependency>
<--sprinhcloud依赖-->
<properties>
<spring-cloud.version>2021.0.1</spring-cloud.version>
</properties>
<!-- 注册中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.1</version>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
第二步:在消费者服务,开启Feign客户端
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
public class CouponsConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(CouponsConsumerApplication.class, args);
}
}
第三步:在消费者服务中,添加Feign的接口(这边我拆分了API接口并继承这个接口)
@FeignClient(name = "coupons-provider")
public interface CouponsService extends CouponsServiceApi {
}
API接口实例
import com.fly.po.Coupons;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
import java.util.Map;
public interface CouponsServiceApi {
@PostMapping("coupons/findCouponsList")
Map<String, Object> findCouponsList(@RequestBody Coupons coupons);
@PostMapping("coupons/findAll")
List<Coupons> findAll();
}
第四步:在生产者服务中,创建Controller,编写对应的接口(实现API接口中的方法)
import com.fly.coupons.provider.service.CouponsService;
import com.fly.po.Coupons;
import com.fly.service.CouponsServiceApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
@RestController
public class CouponsController implements CouponsServiceApi {
@Autowired
private CouponsService couponsService;
@Override
public Map<String, Object> findCouponsList(@RequestBody Coupons coupons) {
return couponsService.findCouponsList(coupons);
}
@Override
public List<Coupons> findAll() {
return couponsService.findAll();
}
}
第五步:yml配置文件(提供者与消费者同步)如果需要nacos的配置管理参考第六步
spring:
application:
name: coupons-provider
cloud:
nacos:
discovery:
server-addr: http://localhost:8848
第六步:nacos配置管理(需要将application.yml
修改为bootstrap.yml
)
spring:
application:
name: coupons-consumer
#选择运行环境 dev 开发环境 test 测试环境
profiles:
active: dev
#允许bean定义覆盖
main:
allow-bean-definition-overriding: true
cloud:
nacos:
config:
server-addr: http://localhost:8848
file-extension: yaml
enabled: true
nacos配置 需要的pom文件
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2021.1</version>
</dependency>
<!-- bootstrap -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.3</version>
</dependency>
在nacos配置管理中心配置部署环境
- 配置内容:
server:
port: 8001
spring:
application:
name: coupons-consumer
#选择运行环境 dev 开发环境 test 测试环境
profiles:
active: dev
#允许bean定义覆盖
main:
allow-bean-definition-overriding: true
cloud:
nacos:
config:
server-addr: http://localhost:8848
file-extension: yaml
enabled: true
datasource:
# 使用阿里的Druid连接池
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
# 填写你数据库的url、登录名、密码和数据库名
url: jdbc:mysql://localhost:3306/2107?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8&useSSL=true&tinyInt1isBit=false
username: root
password: root
druid:
# 连接池的配置信息
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 5
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
mybatis-plus:
mapper-locations: mapper/*.xml
- 如下图所示
- 由
application.name
与profiles.active
拼接
spring:
application:
name: coupons-provider
profiles:
active: dev
22.cnblogs.com/blog/2637336/202203/2637336-20220302162800470-588010615.png)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探