springcloud Feign的使用用法以及与RestTemplate的区别

微服务之间的通信方式

常见的方式有两种:

  • RPC——代表-dubbo
  • HTTP——代表-SpringCloud

在SpringCloud中,默认是使用http来进行微服务的通信,最常用的实现形式有两种:

  • RestTemplate
  • Feign

Feign跟RestTemplate的区别

  1. 请求方式不一样
    RestTemplate需要每个请求都拼接url+参数+类文件,灵活性高但是消息封装臃肿。
    feign可以伪装成类似SpringMVC的controller一样,将rest的请求进行隐藏,不用再自己拼接url和参数,可以便捷优雅地调用HTTP API。

  2. 底层实现方式不一样
    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.nameprofiles.active 拼接
spring:
  application:
    name: coupons-provider
  profiles:
    active: dev

image
22.cnblogs.com/blog/2637336/202203/2637336-20220302162800470-588010615.png)

posted @   小飞的~  阅读(793)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
点击右上角即可分享
微信分享提示