一、环境版本说明
部分引入的pom文件
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.4.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
二、场景描述
使用 ribbon 实现微服务通信。
spring-cloud-starter-alibaba-nacos-discovery 已经集成了 ribbon 相关的包。
![](https://img-blog.csdnimg.cn/img_convert/fa0f14465ac43c6a19abcbc5e723e749.png)
1. 开启负载均衡
使用 @LoadBalanced 让 RestTemplate 具备负载均衡能力
@Configuration
public class RibbonConfig {
@Bean
@LoadBalanced // 让 RestTemplate 具备负载均衡能力
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
2.通过服务名称调用接口
通过 nacos 调用名称为 e-commerce-authority-center 的服务接口
@Slf4j
@Service
public class UseRibbonService {
@Autowired
private RestTemplate restTemplate;
/**
* 通过 Ribbon 调用授权服务中心获取 token
* @param usernameAndPassword
* @return
*/
public JwtToken getTokenFromAuthorityServiceByRibbon(UsernameAndPassword usernameAndPassword) {
// url 中的 ip 和 端口号换成了服务名称
String requestUrl = String.format(
"http://%s/ecommerce-authority-center/authority/token",
"e-commerce-authority-center");
log.info("login request url and body:[{}],[{}]", requestUrl, JSON.toJSONString(usernameAndPassword));
// 发起请求
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
// 使用自己的注入的 RestTemplate
return restTemplate.postForObject(
requestUrl,
new HttpEntity<>(JSON.toJSONString(usernameAndPassword), headers),
JwtToken.class
);
}
}
3. 启动访问出现错误
org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://e-commerce-authority-center/ecommerce-authority-center/authority/token": e-commerce-authority-center; nested exception is java.net.UnknownHostException: e-commerce-authority-center
Caused by: java.net.UnknownHostException: e-commerce-authority-center
找不到服务e-commerce-authority-center
三、解决
修改 pom.xml 文件
单独引用 spring-cloud-loadbalancer ,同时去掉 alibaba-nacos 里 netflix-ribbon 相关包
Ribbon 已经停更了,使用 Spring Cloud Loadbalancer 作为其替代品;
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.9.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
重新启动访问,已能正确的通过服务名访问到接口!