微服务之间调用几种方法

news/2024/12/23 4:30:03/

微服务之间调用几种方法

一、RestTemplate方式
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
服务的消费者(order)调用服务的提供者(Goods)

@Autowired
private RestTemplate restTemplate;

@GetMapping("/createOrder/{gid}/{number}")
public Order order(@PathVariable("gid") Integer id,@PathVariable("number") Integer number){log.info("用户开始下单,调用商品系统,查询{}号商品信息",id);Goods goods = restTemplate.getForObject("http://localhost:9002/goods/getGoods/" + id, Goods.class);log.info("商品信息查询完毕:"+ JSON.toJSONString(goods));log.info("开始下单:");Order order = new Order();order.setUid(1);order.setUname("测试用户");order.setGid(goods.getId());order.setGname(goods.getGoodsName());order.setNumber(number);orderService.createOrder(order);log.info("下单成功");return order;
}

通过上面的方式我们解决了微服务之间的相互调用,但是存在硬编码的问题,如果服务提供者的地址发生变化,就需要手工修改代码;如果有多个服务提供者,无法实现服务的负载均衡;如果服务增多,人工调用会变得更加的复杂。

这个时候就会需要服务治理,服务治理是微服务架构最核心的问题,用于实现各个微服务的自动化注册与发现。在这里选择Nacos。

二、引入Nacos注册中心
1.在服务的提供者与消费者的pom文件中引入依赖

    <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>

2.在application.yml中添加配置

spring:
cloud:
nacos:
discovery:
server-addr: 192.168.206.151:8848
3.在对应的微服务上添加

@EnableDiscoveryClient
4.代码

@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;

@GetMapping("/createOrder2/{gid}/{number}")
public Order order2(@PathVariable("gid") Integer id,@PathVariable("number") Integer number){log.info("用户开始下单,调用商品系统,查询{}号商品信息",id);//从nacos中获取服务地址ServiceInstance service = discoveryClient.getInstances("goods-service").get(0);String url = service.getHost() + ":" + service.getPort();//通过restTemplate调用Goods goods = restTemplate.getForObject("http://"+url+"/goods/getGoods/" + id, Goods.class);log.info("商品信息查询完毕:"+ JSON.toJSONString(goods));log.info("开始下单:");Order order = new Order();order.setUid(1);order.setUname("测试用户");order.setGid(goods.getId());order.setGname(goods.getGoodsName());order.setNumber(number);orderService.createOrder(order);log.info("下单成功");return order;
}

注:DiscoveryClient是专门负责服务注册和发现的,我们可以通过它获取到注册到注册中心的所有服务

三、Fegin实现服务调用
Feign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务一样简单, 只需要创建一个接口并添加一个注解即可。

Nacos很好的兼容了Feign, Feign默认集成了 Ribbon, 所以在Nacos下使用Fegin默认就实现了负载均衡的效果。

在服务消费者上进行以下操作:

1.添加依赖

org.springframework.cloud spring-cloud-starter-openfeign 2.在启动类上添加注解

@EnableFeignClients
3.新建client包,并创建接口(把服务提供者controller对应的方法名复制过来,注意路径要完整。

@FeignClient(“goods-service”)
public interface GoodsService {

@RequestMapping("/goods/getGoods/{id}")
public Goods goods(@PathVariable("id") Integer id);

}
4.代码

@Autowired
private GoodsService goodsService;

@GetMapping("/createOrder3/{gid}/{number}")
public Order order3(@PathVariable("gid") Integer id,@PathVariable("number") Integer number){log.info("用户开始下单,调用商品系统,查询{}号商品信息",id);//通过feign调用商品微服务Goods goods = goodsService.goods(id);log.info("商品信息查询完毕:"+ JSON.toJSONString(goods));log.info("开始下单:");Order order = new Order();order.setUid(1);order.setUname("测试用户");order.setGid(goods.getId());order.setGname(goods.getGoodsName());order.setNumber(number);orderService.createOrder(order);log.info("下单成功");return order;
}

想了解更多,关注wx视频号:石工记,DouY:石工记 看视频更直观


http://www.ppmy.cn/news/244998.html

相关文章

DataSecurity Plus:数字化时代的数据安全护卫者

引言&#xff1a; 在数字化时代&#xff0c;数据成为企业和个人生活中不可或缺的资产。然而&#xff0c;随之而来的是日益增长的数据安全威胁。为了保护数据的机密性、完整性和可用性&#xff0c;数据安全解决方案——DataSecurity Plus应运而生。本文将深入探讨DataSecurity …

POJ1050题解

POJ1050题解 #include <bits/stdc.h> using namespace std; const int N 510; int a[N][N], maxrow[N], row[N]; int main() {int n;cin >> n;//读入矩阵数据for(int i 0; i < n; i )for(int j 0; j < n; j ) cin >> a[i][j];int ans 0;//在求…

8脚 tja1050t_TJA1050T设计的CAN总线通信硬件电路原理图解

分析TJA1050T设计的CAN总线通信硬件电路图。 如图中F040的CAN信号接收引脚RX和发送引脚TX并不直接连接到TJA1050T的RXD和TXD端&#xff0c;而是经由高速光耦6N137进行连接&#xff0c;这样做的目的是为了实现CAN总线各节点的电气隔离。为了实现真正意义上完全的电气隔离&#x…

1050: 阶乘的累加和 C语言

1050: 阶乘的累加和 时间限制: 1 Sec 内存限制: 30 MB 提交: 26798 解决: 21791 [状态] [讨论版] [提交] [命题人:admin] 题目描述 求1! 2! ……n! 输入 输入一个整数n&#xff0c;你可以假定n不大于10。 输出 输出一个整数&#xff0c;即阶乘累加的结果&#xff0c;单独占一…

POJ1050

POJ1050 题目链接&#xff1a;http://poj.org/problem?id1050 题目描述&#xff1a; 首先求矩形区域和显然是使用前缀和。然后要求出最大区域和&#xff0c;则应想到动态规划。 先使用dp[r,c,w,h]表示以(r,c)为矩形右下角顶点时形状为(w,h)的矩形区域和&#xff0c;但这样时…

1050 String Subtraction

1050 String Subtraction Given two strings S1 and S2, SS1−S2 is defined to be the remaining string after taking all the characters in S2 from S1. Your task is simply to calculate S1−S2 for any given strings. However, it might not be that simple to do it …

8脚 tja1050t_CAN总线通信硬件原理图(采用TJA1050T CAN总线驱

CAN总线通信硬件原理图(采用TJA1050T CAN总线驱动器) F040中内置CAN总线协议控制器&#xff0c;只要外接总线驱动芯片和适当的抗干扰电路就可以很方便地建立一个CAN总线智能测控节点。本设计中采用PHILIP公司的TJA1050T CAN总线驱动器。 CAN总线通信硬件原理图如图3所示。 图中…

POJ-1050

题目大意&#xff1a; 输入一个矩阵&#xff0c;求矩阵中最大子矩阵。 例如输入 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 其中最大子矩阵为 9 2 -4 1 -1 8 子矩阵之和为(92) (-41) (-18) 算法&#xff1a; 动态规划。 定义一个数组来保存前一状态&#xff1…