《Spring Cloud 之 Feign 与 Dubbo:微服务架构篇二》

微服务通信

4.1 Feign
4.1.1 Feign简介

Feign是Spring Cloud提供的⼀个声明式的伪Http客户端, 它使得调⽤远程服务就像调⽤本地服务⼀样简单, 只需要创建⼀个接⼝并添加

⼀个注解即可。 Nacos很好的兼容了Feign, Feign默认集了Ribbon, 所以在Nacos下使⽤Fegin默认就实现了负载均衡的效果

官⽅地址: https://github.com/OpenFeign/feign

4.1.2 基本使用
1.加⼊Fegin的依赖
<!--fegin组件-->
<dependency>
	 <groupId>org.springframework.cloud</groupId>
 	 <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.在主类上添加Fegin的注解
@EnableFeignClients//开启Fegin

3.创建⼀个service, 并使⽤Fegin实现微服务调⽤
@FeignClient("service-product")//声明调⽤的提供者的name
public interface ProductService {
	 //指定调⽤提供者的哪个⽅法
 	//@FeignClient+@GetMapping 就是⼀个完整的请求路径 http://service- product/product/{pid}
	 @GetMapping(value = "/product/{pid}")
	 Product findByPid(@PathVariable("pid") Integer pid);
		}

4.修改controller代码,并启动验证
5.重启order微服务,查看效果
4.1.3 自定义配置
Feign可以⽀持很多的⾃定义配置,⼀般情况下,默认值就能满⾜我们使⽤,如果要⾃定义时,只需要创建⾃定义的@Bean覆盖默认Bean即可.

配置⽂件⽅式
基于配置⽂件修改feign的⽇志级别可以针对单个服务:
	feign: 
     client:
    	 config:
    		 service-product: # 针对某个微服务的配置
     		 	loggerLevel: FULL # ⽇志级别
也可以针对所有服务:
		feign: 
         client:
         	config:
        	 default: # 这⾥⽤default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
         		loggerLevel: FULL # ⽇志级别
注意:需要把⽇志级别设置
        logging:
         	level:
         		com.apesource: debug
⽇志的级别分为四种:
NONE:不记录任何⽇志信息,这是默认值。
BASIC:仅记录请求的⽅法, URL以及响应状态码和执⾏时间
HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。
4.1.4 Feign使用优化
Feign底层发起http请求,依赖于其它的框架。其底层客户端实现包括:
URLConnection:默认实现,不⽀持连接池
Apache HttpClient :⽀持连接池
OKHttp:⽀持连接池
因此提⾼Feign的性能主要⼿段就是使⽤连接池代替默认的URLConnection
这⾥我们⽤Apache的HttpClient来演示

1.引⼊依赖
<!--httpClient的依赖 -->
<dependency>
 <groupId>io.github.openfeign</groupId>
 <artifactId>feign-httpclient</artifactId>
</dependency>

2.配置连接池
feign:
 client:
 	config:
 		default: # default全局的配置
 			loggerLevel: BASIC # ⽇志级别,BASIC就是基本的请求和响应信息
 httpclient:
 	enabled: true # 开启feign对HttpClient的⽀持
 	max-connections: 200 # 最⼤的连接数
 	max-connections-per-route: 50 # 每个路径的最⼤连接数
 	
总结:
1.⽇志级别尽量⽤basic
2.使⽤HttpClient或OKHttp代替URLConnection
引⼊feign-httpClient依赖
配置⽂件开启httpClient功能,设置连接池参数

案例源码:

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients //开启Fegin

public class ShopOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ShopOrderApplication.class, args);
    }
}

@FeignClient("service-product")
public interface IProductService {
        //指定调⽤提供者的哪个⽅法
        //@FeignClient+@GetMapping 就是⼀个完整的请求路径 http://service-product/product/{pid}
        @GetMapping(value = "/product/getPro/{pid}")
        Product getProductById(@PathVariable("pid") Integer pid);
}

@RestController
public class OrderController{
    @Autowired
    private IOrderService orderService;
    @Autowired
    private IProductService iProductService;
    //Ribbon下单
    @RequestMapping("/order/prod/{pid}")
    public Order order(@PathVariable("pid")Integer pid) {
        //通过fegin调用商品微服务
        Product product = iProductService.getProductById(pid);
        //下单(创建订单)
        Order order = new Order();
        order.setUid(1);
        order.setUsername("测试用户");
        order.setPid(pid);
        order.setPname(product.getPname());
        order.setPprice(product.getPprice());
        order.setNumber(1);
        orderService.save(order);
        return order;
    }
    
        @RequestMapping("/product/getPro/{pid}")
    public Product getProductById(@PathVariable("pid")Integer pid) {
        Product product = productService.getById(pid);
        System.out.println(product);
        return product;
    }
4.2 Dubbo
4.2.1 Dubbo简介

Dubbo是阿⾥巴巴开源的基于 Java 的⾼性能 RPC分布式服务框架,致⼒于提供⾼性能和透明化的RPC远程服务调⽤⽅案,以及SOA服务治理⽅案。 Spring Cloud Alibaba微服务开发框架集成了Dubbo,可实现微服务对外暴露Dubbo协议的接⼝,Dubbo协议相⽐RESTful协议速度更快RPC:RPC是远程过程(Remote Procedure Call)的缩写形式,调⽤RPC远程⽅法就像调⽤本地⽅法⼀样,Dubbo之前阿⾥研发,中间停⽌维护2年,最后开启维护并捐献给Apache.

官⽅地址:http://dubbo.io/

image-20240822120415557

以上是 Dubbo 的⼯作原理图,从抽象架构上分为两层:服务治理抽象控制⾯ 和 Dubbo 数据⾯.

4.2.2 基本使用
1.提供统⼀业务api
/**
实战中,会将所有服务接⼝设计给⼀个叫做api的服务,单独维护,此处就在common服务设置
*/
public interface IProductService {
 Product findByPid(Integer pid);
}

2.添加依赖 (编辑服务提供者product、编辑服务消费者)
<!--dubbo-->
<dependency>
 <groupId>com.alibaba.cloud</groupId>
 <artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>

3.添加dubbo配置(编辑服务提供者product)
(1)
dubbo:
 scan:
 	base-packages: com.apesource.service.impl # 开启包扫描
 protocols:
 	dubbo:
         name: dubbo # 服务协议
         port: -1 # 服务端⼝ 使⽤随机端⼝
 registry:
 	address: spring-cloud://localhost # 注册中⼼

(2)
添加dubbo配置(编辑服务消费者)
dubbo:
 	registry:
 		address: spring-cloud://localhost # 注册中⼼
 	cloud:
 		subscribed-services: service-product # 订阅的提供者名称

4.编写并暴露服务(编辑服务提供者product)
//暴露服务:注意这⾥使⽤的是dubbo提供的注解@Service,⽽不是Spring的
    @Service
     public class ProductServiceImpl implements ProductService {
     @Autowired
     private ProductDao productDao;
     @Override
     public Product findByPid(Integer pid) {
     return productDao.findById(pid);
 	}
}

(2)编辑服务消费者 引⽤服务
    @RestController
     public class OrderController {
     @Autowired
     private OrderService orderService;
     //引⽤服务
     @Reference
     private IProductService productService;
     @RequestMapping("/order/prod/{pid}")
     public Order order(@PathVariable Integer pid) {
     System.out.println("接收到{}号商品的下单请求,接下来调⽤商品微服务查询
    此商品信息"+pid);
     //调⽤商品微服务,查询商品信息
     Product product = productService.findByPid(pid);
     System.out.println("查询到{}号商品的信息,内容是:{}"+JSON.toJSONStr
    ing(product));
     //下单(创建订单)
     Order order = new Order();
     order.setUid(1);
     order.setUsername("测试⽤户");
     order.setPid(pid);
     order.setPname(product.getPname());
     order.setPprice(product.getPprice());
     order.setNumber(1);
     orderService.createOrder(order);
     System.out.println("创建订单成功,订单信息为{}"+JSON.toJSONString(
    order));
     return order;
     }
}

5.服务调⽤测试

源码案例:

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients //开启Fegin

public class ShopOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ShopOrderApplication.class, args);
    }
}

@FeignClient(value = "service-product")
public interface IProductService {
    //指定调⽤提供者的哪个⽅法
    //@FeignClient+@GetMapping 就是⼀个完整的请求路径 http://service-product/product/{pid}
    @GetMapping(value = "/product/getPro/{pid}")
    Product getProductById(@PathVariable("pid") Integer pid);

    //减库存
    @GetMapping("/product/reduceInventory/{pid}/{num}")
    void reduceInventory(@PathVariable("pid") Integer pid, @PathVariable("num") int num);
}

public Order order(Integer pid) {
    //通过fegin调用商品微服务
    Product product = iProductService.getProductById(pid);
    //下单(创建订单)
    Order order = new Order();
    order.setUid(1);
    order.setUsername("测试用户");
    order.setPid(pid);
    order.setPname(product.getPname());
    order.setPprice(product.getPprice());
    order.setNumber(1);
    OrderService.save(order);
    iProductService.reduceInventory(pid,order.getNumber());
    return order;
}

//减少库存
@RequestMapping("/product/reduceInventory/{pid}/{num}")
public void reduceInventory(@PathVariable("pid") Integer pid,@PathVariable("num") int num) {
    productService.reduceInventory(pid, num);
}
总结:

本文深入探讨了 Spring Cloud 中的两个关键组件 ——Feign 和 Dubbo。
Feign 是一个声明式的伪 Http 客户端,使得调用远程服务变得极为简便,仅需创建接口并添加注解。它默认集成 Ribbon,在 Nacos 环境下可实现负载均衡。在使用上,通过添加依赖、在主类添加注解开启 Feign,创建服务接口并指定调用的提供者方法,然后修改 controller 代码进行验证。同时,Feign 支持自定义配置,可通过配置文件修改日志级别,针对单个服务或全局进行配置,日志级别分为 NONE、BASIC、HEADERS 和 FULL 四种。为提升性能,可使用连接池代替默认的 URLConnection,如引入 Apache 的 HttpClient 依赖并配置连接池参数。
Dubbo 是阿里巴巴开源的高性能 RPC 分布式服务框架。其工作原理图分为服务治理抽象控制面和 Dubbo 数据面。使用时,先提供统一业务 api,添加依赖后,在服务提供者中配置扫描包、服务协议和端口、注册中心等信息以暴露服务;服务消费者则配置注册中心和订阅的提供者名称来引用服务。
总的来说,Feign 和 Dubbo 在 Spring Cloud 微服务架构中都发挥着重要作用,开发者可根据实际需求选择合适的远程服务调用方式,以构建高效、稳定的微服务系统。

  • 23
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值