二、SpringCloud Alibaba使用RestTemplate
新建模块Producer,pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.example</groupId>
<artifactId>SpringCloudAlibabaDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>Producer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Producer</name>
<description>Producer</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
</project>
配置application.properties:
server.port=7000
spring.application.name=producer
spring.cloud.nacos.discovery.server-addr=localhost:8848
新建Controller:
@RestController
public class HelloProducer {
@Value("${server.port}")
private int port;
@RequestMapping("/hello")
public String hello() {
return "hello,Producer,port:" + port;
}
}
在SpringCloudAlibabaDemo的pom.xml加入
<modules>
<module>Consumer</module>
<module>Producer</module>
</modules>
在Consumer加入:
@Configuration
public class MyConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
修改HelloConsumer:
@RestController
@RequestMapping("/consumer")
public class HelloConsumer {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@Value("${server.port}")
private int port;
@RequestMapping("/hello")
public String hello() {
return "hello,Consumer,port:" + port;
}
@RequestMapping("/rpc")
public String rpc() {
List<ServiceInstance> producer = discoveryClient.getInstances("producer");
ServiceInstance serviceInstance = null;
if (producer != null && !producer.isEmpty()) {
serviceInstance = producer.get(0);
}
if (serviceInstance != null) {
return restTemplate.getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/hello",String.class);
} else {
throw new RuntimeException("未找到Producer服务");
}
}
}
访问http://localhost:7001/consumer/rpc,看到hello,Producer,port:7000。在这里是通过DiscoveryClient解析出服务的ip和端口后通过RestTemplate调用。
在2021.0.4.0版本的springCloudAlibaba中,spring-cloud-starter-alibaba-nacos-discovery
依赖引入了spring-cloud-loadbalancer
作为负载均衡,RestTemplate要使用负载均衡,只需添加@LoadBalanced:
@Configuration
public class MyConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
同时添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
<version>3.1.4</version>
</dependency>
修改HelloConsumer:
@RequestMapping("/rpc1")
public String rpc1() {
return restTemplate.getForObject("http://producer/hello",String.class);
}
访问http://localhost:7001/consumer/rpc1,看到hello,Producer,port:7000。
在启动一个端口是7002的Producer,访问http://localhost:7001/consumer/rpc1,看到负载均衡成功。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!