当前位置: 首页 > news >正文

微服务通信

一、Feign远程调⽤

        以前我们是通过RestTemplate发起远程调用的:

//通过restTemplate调用商品微服务
String url = "service-product";
Product product = restTemplate.getForObject( "http://"+url+"/product/" + pid, Product.class);

         但是这个方法存在一些问题:

①代码可读性差

②参数复杂,url难以维护

所以我们在这篇文章中引入了两个新的通信服务:Feign和Dubbo

1.1 Feign简介

        Feign是Spring Cloud提供的⼀个声明式的伪Http客户端, 它使得调⽤远程服务就像调⽤本 地服务⼀样简单, 只需要创建⼀个接⼝并添加⼀个注解即可。 Nacos很好的兼容了Feign, Feign 默认集了Ribbon, 所以在Nacos下使⽤Fegin默认就实现了负载均衡的效果 官⽅地址: https://github.com/OpenFeign/feign

1.2 基本使⽤

//1.加入Feign的依赖(pom.xml文件)

<!--fegin组件--> 
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> 
</dependency>

//2. 在主类上添加Fegin的注解

@SpringBootApplication
@EnableFeignClients //开启Fegin
public class ShopOrderApplication {public static void main(String[] args) {SpringApplication.run(ShopOrderApplication.class, args);}}

//3.创建一个 service, 并使⽤Fegin实现微服务调⽤

@FeignClient("service-product")//声明调⽤的提供者的name
public interface IProductService {@GetMapping(value = "/product/{pid}")Product findByPid(@PathVariable("pid") Integer pid);
}

//4. 修改controller代码(通过feign来进行微服务的调用),并启动验证

@RestController
public class OrderController {@Autowiredprivate IProductService productService;@Autowiredprivate IOrderService orderService;//获取nacos中服务的元数据@Autowiredprivate DiscoveryClient discoveryClient;//Ribbon下单@RequestMapping("/order/prod/{pid}")public Order order(@PathVariable("pid") Integer pid) {//通过fegin调用商品微服务Product product = productService.findByPid(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.createOrder(order);return order;}
}

//5. 重启order微服务,查看效果  

1.3 ⾃定义配置

Feign可以⽀持很多的⾃定义配置,如下表所示:

类型作⽤说明
feign.Logger.Level修改⽇志级别包含四种不同的级别: NONE、 BASIC、 HEADERS、 FULL
feign.codec.Decoder响应结果的解析器http远程调⽤的结果做解析,例 如解析json字符串为java对象
feign.codec.Encoder请求参数编码将请求参数编码,便于通过http 请求发送
feign. Contract⽀持的注解格式默认是SpringMVC的注解
feign. Retryer失败重试机制请求失败的重试机制,默认是没 有,不过会使⽤ Ribbon的重试

        ⼀般情况下,默认值就能满⾜我们使⽤,如果要⾃定义时,只需要创建⾃定义的@Bean覆盖默认Bean 即可。 

配置⽂件⽅式

基于配置⽂件修改feign的⽇志级别可以针对单个服务:

feign: client:config: service-product: # 针对某个微服务的配置loggerLevel: FULL # ⽇志级别 

 也可以针对所有服务:

feign: client:config: default: # 这⾥⽤default就是全局配置,如果是写服务名称,则是针对某个微服务的配
置loggerLevel: FULL # ⽇志级别

⽽⽇志的级别分为四种:

NONE:不记录任何⽇志信息,这是默认值

BASIC:仅记录请求的⽅法, URL以及响应状态码和执⾏时间

HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息

④ FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。

二、Dubbo

2.1 基本简介

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

2.2 基础实现    

A.提供统⼀业务api (shop_common)

package com.apesource.shop_common.service;import com.apesource.shop_common.domain.Product;public interface IProductService {/**实战中,会将所有服务接口设计给一个叫做api的服务,单独维护,此处就在common服务设置*/Product findByPid(Integer pid);

  B.编辑服务提供者product

//1.添加依赖:

<!-- dubbo -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>

//2.添加dubbo配置 

dubbo:scan:base-packages: com.apesource.shop_product.service.implprotocols:dubbo:name: dubboport: -1registry:address: spring-cloud://localhost

//3.编写并暴露服务

import com.apesource.shop_common.domain.Product;
import com.apesource.shop_common.service.IProductService;
import com.apesource.shop_product.dao.ProductMapper;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;//暴露服务:注意这⾥使⽤的是dubbo提供的注解@Service,⽽不是Spring的
@Service
public class ProductServiceImpl implements IProductService {@AutowiredProductMapper productMapper;@Overridepublic Product findByPid(Integer pid) {return productMapper.selectById(pid);}
}

C.编辑服务消费者

//1.添加依赖

<!--dubbo--> 
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> 
</dependency>

//2.添加dubbo配置

dubbo:registry:address: spring-cloud://localhostcloud:subscribed-services: service-product

//3.引⽤服务

@RestController
public class OrderController {//引用服务@ReferenceIProductService productService;@Autowiredprivate IOrderService orderService;//Ribbon下单@RequestMapping("/order/prod/{pid}")public Order order(@PathVariable("pid") Integer pid) {//通过dubbo调用商品微服务Product product = productService.findByPid(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.createOrder(order);return order;}
}

//4.重启服务类:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SOMEIP_ETS_066: String_UTF8FIXED_too_short
  • 网络安全-防火墙安全策略初认识
  • ABB机器人accset指令运用
  • windows本地搭建zookeeper和kafka环境
  • Android fork 进程 process(init/Zygote/SystemServer)
  • 基于Java爬取微博数据(四) 获取 图片 or 视频
  • python手写了个简易的豆瓣影评爬虫
  • 【消息中间件】RabbitMQ
  • NC设计LFU缓存结构
  • 鸿蒙OS试题
  • three.js 着色器学习 聚集地
  • Ubuntu 20.04 源码编译安装OpenCV 4.5
  • stm32启动文件
  • 信贷业务流程优化与风控系统深度集成
  • popen和fgets函数
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【前端学习】-粗谈选择器
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • angular学习第一篇-----环境搭建
  • Java方法详解
  • PAT A1092
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • SOFAMosn配置模型
  • storm drpc实例
  • Tornado学习笔记(1)
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 基于组件的设计工作流与界面抽象
  • 开发基于以太坊智能合约的DApp
  • 目录与文件属性:编写ls
  • 前端js -- this指向总结。
  • 前端面试总结(at, md)
  • 前端性能优化--懒加载和预加载
  • 容器服务kubernetes弹性伸缩高级用法
  • 提醒我喝水chrome插件开发指南
  • 微信小程序:实现悬浮返回和分享按钮
  • C# - 为值类型重定义相等性
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​2021半年盘点,不想你错过的重磅新书
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (31)对象的克隆
  • (libusb) usb口自动刷新
  • (WSI分类)WSI分类文献小综述 2024
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (蓝桥杯每日一题)love
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (数据结构)顺序表的定义
  • (转)linux 命令大全
  • (转)菜鸟学数据库(三)——存储过程
  • ***监测系统的构建(chkrootkit )
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .naturalWidth 和naturalHeight属性,
  • .Net 6.0 处理跨域的方式