SpringCloud Alibaba Nacos 注册中心/配置中心
Nacos
一 Nacos的安装
网址:Nacos Server 下载 | 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=8080spring.cloud.nacos.server-addr=127.0.0.1:8848
开启项目访问地址:
显示服务则成功
另一个server-product也是一样
最终效果:
1 模拟多个
参数
展示:
2 服务发现与负载均衡的实现
1 如果是第一次调用,注册中心宕机,则不能调用成功。
2 如果已经调用过,注册中心宕机,则可以调用成功。-相当于是一个缓存机制
@Slf4j
@Service
public class OrderServiceImpl implements OrderService {@Autowiredprivate DiscoveryClient discoveryClient;@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate LoadBalancerClient loadBalancerClient;@Overridepublic 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=8080spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848spring.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-orderprofiles:active: prodcloud:nacos:server-addr: 127.0.0.1:8848config:import-check:enabled: falsenamespace: ${spring.profiles.active:dev}---
spring:config:import:- nacos:common.properties?group=order- nacos:database.properties?group=orderactivate:on-profile: dev---
spring:config:import:- nacos:common.properties?group=order- nacos:database.properties?group=order- nacos:haha.properties?group=orderactivate:on-profile: test---
spring:config:import:- nacos:common.properties?group=order- nacos:database.properties?group=order- nacos:haha.properties?group=orderactivate:on-profile: prod