SpringCloud通过Nacos实现注册中心与远程服务调用详解流程
作者:有头发的程序猿!
本文主要记录基于Nacos实现服务注册中心和远程服务调用
1. 基于Nacos实现服务注册与发现
基于pring-boot-starter-parent 2.6.8,pring-cloud-dependencies 2021.0.3
,order服务和user服务
1.1 pom依赖
<!--服务注册与发现--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2021.0.1.0</version> </dependency> <!--远程服务调用负载均衡--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-loadbalancer</artifactId> </dependency>
1.2 yaml配置
order服务application.yml
spring:
application:
name: orderservice
cloud:
#找对应网段的网卡 不配置内部服务就走外网
inetutils:
preferred-networks: 192.168.0
nacos:
discovery:
server-addr: 192.168.0.221:8848
user服务application.yml
spring:
application:
name: userservice
cloud:
#找对应网段的网卡 不配置内部服务就走外网
inetutils:
preferred-networks: 192.168.0
nacos:
discovery:
server-addr: 192.168.0.221:8848
1.3 添加启动注解
@EnableDiscoveryClient
,需要注册到Nacos的服务都需要添加
@SpringBootApplication @EnableDiscoveryClient public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } }
1.4 启动服务查看控制台
控制台地址http://192.168.0.221:8848/nacos
,账号密码都是nacos
,查看服务列表
服务详情图
如果未配置preferred-networks
,ip则显示外网ip,也会用于服务调用
2.基于Nacos实现远程服务调用
2.1 客户端创建RestTemplate Bean
@LoadBalanced // 开启负载均衡策略 @Bean public RestTemplate restTemplate() { return new RestTemplate(); }
2.2 客户端调用代码
@Autowired RestTemplate restTemplate; @Autowired private DiscoveryClient discoveryClient; @GetMapping("/test") public String test() throws Exception { //可以获取到对应服务的列表 服务名 ip 端口均可从这里面获取到 也可以自己决定调用顺序 List<ServiceInstance> instances = discoveryClient.getInstances("userservice"); //get方式调用 String template = restTemplate.getForObject("http://userservice/getTime/1123?name=jack", String.class); Map<String, Object> resMap = new HashMap<>(); resMap.put("aaaa", "bbbb"); //post调用方式 RequestEntity<Map<String, Object>> requestEntity = RequestEntity .post("http://userservice/postTime") .contentType(MediaType.APPLICATION_JSON) .body(resMap); ResponseEntity<Map> responseEntity = restTemplate.exchange(requestEntity, Map.class);] log.info("rest -- {}", template + ":" + responseEntity.getBody()); return template + ":" + responseEntity.getBody(); }
2.3 服务端暴露接口
@GetMapping("/getTime/{uuid}") public String getTime(@PathVariable String uuid, @RequestParam String name) { return new Date().getTime() + ":" + uuid + ":" + name; } @PostMapping("/postTime") public Map<String, Object> getTime(@RequestBody Map<String, Object> params) { params.put("time", new Date().getTime()); return params; }
2.4 服务调用测试
访问客户端调用接口,截图如下
控制台日志:
c.e.order.controller.OrderController : rest -- 1657182229010:1123:jack:{aaaa=bbbb, time=1657182229068}
在使用过程中发现想接收List<Map<String,Object>>
太麻烦了,还是使用模板的远程调用openfeign
了,下文分享。
到此这篇关于SpringCloud通过Nacos实现注册中心与远程服务调用详解流程的文章就介绍到这了,更多相关SpringCloud Nacos注册中心内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!