目录

SpringCloud-Alibaba-Nacos-注册中心配置中心二

SpringCloud Alibaba Nacos 注册中心/配置中心(二)

Nacos

一 Nacos的安装

https://i-blog.csdnimg.cn/direct/5035cef612c440f6bfb0a70689ed06fa.png

网址:

1 我下的版本为2.5.1

错误根源分析:
在堆栈跟踪的最底部,你可以看到根本原因:
Caused by: java.net.UnknownHostException: jmenv.tbsite.net

Nacos 的设计中,在集群模式下(即使你指定了 -m standalone,某些配置可能仍会触发集群查找逻辑),会尝试通过访问一个地址服务器(Address Server)来获取集群节点列表。这个地址服务器的域名默认就是 jmenv.tbsite.net(这是阿里云内部的一个域名)。在你的本地开发环境中,这个域名是无法解析的,因此抛出了 UnknownHostException

同时也需要在管理员的身份运行

https://i-blog.csdnimg.cn/direct/320e8c01bebf4928a0d997b8d15504b5.png

解决方案

方式 1:修改 Nacos 配置文件,避免使用 jmenv.tbsite.net

  1. 打开 D:\JAVA\nacos\conf\application.propertiesnacos/conf/application.properties
  2. 找到 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

二 服务注册

https://i-blog.csdnimg.cn/direct/37703c3c91794787a2a87ff650c91a2b.png

依赖

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

创建相关的项目配置文件

https://i-blog.csdnimg.cn/direct/48857001b41441e5acf7423b4758df9b.png

spring.application.name=service-order
server.port=8080

spring.cloud.nacos.server-addr=127.0.0.1:8848

开启项目访问地址:

显示服务则成功

https://i-blog.csdnimg.cn/direct/dbff8179529d4153b969eb57b825e863.png

另一个server-product也是一样

最终效果:

https://i-blog.csdnimg.cn/direct/aed2ad20d40a49d2b1ef81ac69115732.png

1 模拟多个

https://i-blog.csdnimg.cn/direct/c5cefd6174364137b09904b92fef1fd0.png

参数

https://i-blog.csdnimg.cn/direct/f69bd131d8ca435888deffd46056bfb8.png

展示:

https://i-blog.csdnimg.cn/direct/0a77b74bfa864bf7865c1e5b4fa1f558.png

https://i-blog.csdnimg.cn/direct/58987aad6b5c483799a846b136af2156.png

2 服务发现与负载均衡的实现

https://i-blog.csdnimg.cn/direct/8fb010b18a364accbf22a105a67240b4.png

https://i-blog.csdnimg.cn/direct/26435ca63e114949a61dc6e48dbd8ca2.png

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);
    }

三 配置中心

https://i-blog.csdnimg.cn/direct/ab8ed9c8c2a4491a9ee3e9041653dc33.png

依赖导入:

        <!-- 配置中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

编写配置:

创建对应的数据集:

https://i-blog.csdnimg.cn/direct/1d9d780f0db345dc97a9771c08e8cd71.png

https://i-blog.csdnimg.cn/direct/1e2a7f060a1e433c9b7ee7f88c6a9459.png

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

动态刷新

https://i-blog.csdnimg.cn/direct/9b1b69f6e5b74762890fbe317d4bedb4.png

https://i-blog.csdnimg.cn/direct/01414e76d72c47009bfe2f730338e68e.png

https://i-blog.csdnimg.cn/direct/2341441b32344df8b5bf44742d884a17.png

https://i-blog.csdnimg.cn/direct/65c0766cf1b14a738d39dae88ba44fa7.png

新建名称空间:

https://i-blog.csdnimg.cn/direct/7b6cc2e84d334b37b84bc42cd3dc4c0a.png

https://i-blog.csdnimg.cn/direct/93b489cbac1f4b0897008386553c55bf.png

https://i-blog.csdnimg.cn/direct/a04e39a1d3264151b19288dc6590873a.png

总结:

https://i-blog.csdnimg.cn/direct/62677e451e374087aff6f606d8316119.png

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