SpringCloud-Alibaba-Nacos-注册中心配置中心二
目录
SpringCloud Alibaba Nacos 注册中心/配置中心(二)
Nacos
一 Nacos的安装
网址:
1 我下的版本为2.5.1
错误根源分析:
在堆栈跟踪的最底部,你可以看到根本原因:Caused by: java.net.UnknownHostException: jmenv.tbsite.net
Nacos 的设计中,在集群模式下(即使你指定了 -m standalone
,某些配置可能仍会触发集群查找逻辑),会尝试通过访问一个地址服务器(Address Server)来获取集群节点列表。这个地址服务器的域名默认就是 jmenv.tbsite.net
(这是阿里云内部的一个域名)。在你的本地开发环境中,这个域名是无法解析的,因此抛出了 UnknownHostException
。
同时也需要在管理员的身份运行
解决方案
方式 1:修改 Nacos 配置文件,避免使用 jmenv.tbsite.net
- 打开
D:\JAVA\nacos\conf\application.properties
或nacos/conf/application.properties
。 - 找到
nacos.core.member.lookup.type
相关配置,设置为 static,让 Nacos 直接使用静态 IP 列表,而不是去连外网。
加两行参数
nacos.core.member.lookup.type=static
nacos.core.member.lookup=127.0.0.1:8848
在bin目录下开启 使用命令:
.\startup.cmd -m standalone
二 服务注册
依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
创建相关的项目配置文件
spring.application.name=service-order
server.port=8080
spring.cloud.nacos.server-addr=127.0.0.1:8848
开启项目访问地址:
显示服务则成功
另一个server-product也是一样
最终效果:
1 模拟多个
参数
展示:
2 服务发现与负载均衡的实现
1 如果是第一次调用,注册中心宕机,则不能调用成功。
2 如果已经调用过,注册中心宕机,则可以调用成功。-相当于是一个缓存机制
@Slf4j
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@Override
public Order createOrder(Long productId, Long userId) {
Product product = getProductFromRemote3(productId);
Order order = new Order();
order.setId(1L);
// 远程调用计算商品数额
order.setTotalAmount(product.getPrice().multiply(new BigDecimal(product.getNum())));
order.setUserId(userId);
order.setNickName("张三");
order.setAddress("青岛");
// 远程调用获取商品信息
order.setProductList(Arrays.asList(product));
return order;
}
// 1 从商品服务中获取商品信息(默认第一个)
private Product getProductFromRemote(Long productId) {
//1 获取到商品服务所在的所有机器IP+端口
List<ServiceInstance> instances = discoveryClient.getInstances("service-product");
ServiceInstance instance = instances.get(0);
//2 机器的IP+端口
String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/product/" + productId;
log.info("url:{}", url);
//3 通过RestTemplate远程调用
Product product = restTemplate.getForObject(url, Product.class);
return product;
}
// 2 从商品服务中获取商品信息(依赖注入的方式 负载均衡)
private Product getProductFromRemote2(Long productId) {
ServiceInstance instance = loadBalancerClient.choose("service-product");
String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/product/" + productId;
log.info("url:{}", url);
return restTemplate.getForObject(url, Product.class);
}
// 3 从商品服务中获取商品信息(基于注解的方式 负载均衡)
private Product getProductFromRemote3(Long productId) {
// 基于注解的方式,service-product会被动态替换为对应的ip地址与端口
return restTemplate.getForObject("http://service-product/product/" + productId, Product.class);
}
三 配置中心
依赖导入:
<!-- 配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
编写配置:
创建对应的数据集:
spring.application.name=service-order
server.port=8080
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.config.import=nacos:service-order.properties
spring.cloud.nacos.config.import-check.enabled=false
动态刷新
新建名称空间:
总结:
server:
port: 8080
spring:
application:
name: service-order
profiles:
active: prod
cloud:
nacos:
server-addr: 127.0.0.1:8848
config:
import-check:
enabled: false
namespace: ${spring.profiles.active:dev}
---
spring:
config:
import:
- nacos:common.properties?group=order
- nacos:database.properties?group=order
activate:
on-profile: dev
---
spring:
config:
import:
- nacos:common.properties?group=order
- nacos:database.properties?group=order
- nacos:haha.properties?group=order
activate:
on-profile: test
---
spring:
config:
import:
- nacos:common.properties?group=order
- nacos:database.properties?group=order
- nacos:haha.properties?group=order
activate:
on-profile: prod