SpringCloud实践系列(一):Nacos注册中心

295 阅读4分钟

“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第6篇文章,点击查看活动详情

SpringCloud实践系列(一):Nacos注册中心

Nacos: 注册中心,解决服务注册与发现

SpringCloud实践系列(二):Ribbon负载均衡

Ribbon: 客户端的负载均衡器,解决服务集群的负载均衡

SpringCloud实践系列(三):OpenFeign服务调用

OpenFeign:声明式的HTTP客户端,服务远程调用

SpringCloud实践系列(四):Nacos配置中心

Nacos:配置中心,中心化管理配置文件

SpringCloud实践系列(五):Sentinel流控

Sentinel:微服务流量卫兵,以流量为入口,保护微服务,防止出现服务雪崩

SpringCloud实践系列(六):Gateway网关(待更新)

Gateway: 微服务网关,服务集群的入口,路由转发以及负载均衡(结合Sentinel)

SpringCloud实践系列(七):Sleuth链路追踪(待更新)

Sleuth: 链路追踪,链路快速梳理、故障定位等

SpringCloud实践系列(八):Seata分布式事务(待更新)

Seata: 分布式事务解决方案

image.png

一、概述

1.1、什么是Nacos

Nacos可用于微服务的注册中心、配置中心

【注册中心】

用于微服务的注册,解决微服务之间相互负载均衡的调用问题的组件之一

【微服务之间相互负载均衡的调用】

注册中心 + 负载均衡器 + 服务远程调用

1.2、Nacos功能

image.png

1.3、Nacos注册中心原理图

image.png

二、安装使用

2.1、安装

2.2、问题解决

mac升级后无法启动nacos

 # 查看日志报错
 /Library/Internet: No such file or directory
 
 # 原因是
 /usr/libexec/java_home -V   
 
 # 可以查到有两条地址,第一条是系统默认的,第二条是自己的,由于第一条在Internet后边有空格,导致我们的报错
 Matching Java Virtual Machines (2):
    1.8.211.12 (x86_64) "Oracle Corporation" - "Java" /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
    1.8.0_211 (x86_64) "Oracle Corporation" - "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home
    
# 修改nacos的startup.sh文件
vi startup.sh
/done # 搜一下定位到这里
done
 
export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"

# 把done下的第一条,JAVAHOME地址,改为我们上边查到的自己的jdk地址,保存
done
 
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home
export JAVA="$JAVA_HOME/bin/java"

# 重启即可
sh startup.sh -m standalone

三、快速开始

引入依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.0.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>Hoxton.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<!--springboot端点监控-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--nacos 注册中心-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

启动类加注解

// 启动类上开启服务注册与发现功能
@EnableDiscoveryClient 

3.1、服务注册

在配置文件中配置nocos相关参数即可

  • 配置注册服务

    spring:
      application:
        name: cloud-goods # 服务名
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848 # 指定nacos-server的地址
            username: nacos
            password: nacos
    server:
      port: 9001 
    
  • 提供服务

    import com.decade.Goods;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("goods")
    public class GoodsController {
        @GetMapping("fingById/{id}")
        public Goods findById(@PathVariable String id) {
            System.out.println("id: " + id);
            return new Goods("《java开发手册》", 99);
        }
    }
    
  • nacos中查看

    image.png

    image.png

3.2、服务发现

  • 引入RestTemplate

    📢要加@LoadBalanced注解,不然url中不能使用服务名,会报java.net.UnknownHostException:服务名

    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.client.ClientHttpRequestFactory;
    import org.springframework.http.client.SimpleClientHttpRequestFactory;
    import org.springframework.web.client.RestTemplate;
    
    
    @Configuration
    public class ApiConfig {
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
            return new RestTemplate(factory);
        }
    
        @Bean
        public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
            //默认的是JDK提供http连接,需要的话可以通过setRequestFactory方法替换为例如Apache HttpComponents、Netty或OkHttp等其它HTTP library。
            SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
            factory.setReadTimeout(5000);
            factory.setConnectTimeout(5000);
            return factory;
        }
    }
    
  • 服务调用

    import java.util.HashMap;
    import java.util.Map;
    
    @RestController
    @AllArgsConstructor
    @RequestMapping("order")
    public class OrderController {
    
        private RestTemplate restTemplate;
    
        @PostMapping("save/{id}")
        public Map save(@PathVariable String id) {
            // 1、使用服务名(cloud-goods),远程调用商品详情
            String url = "http://cloud-goods/goods/fingById/" + id;
            Goods goods = restTemplate.getForObject(url, Goods.class);
    
            // 2、保存订单
            System.out.println("保存" + goods.getGoodsName() + "订单完成");
            // 3、返回
            return new HashMap() {{
                put("code", 200);
                put("msg", "success");
            }};
        }
    }
    
  • 测试负载均衡

    修改服务提供者的提示

    import com.decade.Goods;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("goods")
    public class GoodsController {
        @GetMapping("fingById/{id}")
        public Goods findById(@PathVariable String id) {
            System.out.println("id: " + id);
            // 不同名,用于区分服务
            return new Goods("《服务9001》", 99); 
        }
    }
    

    测试

    访问http://localhost:9003/order/save/12,可以看到:两个服务1:1的被调用

    image.png

四、nacos领域模型

nacos的服务由三元组唯一确定:namespace、group、servicename

nacos的配置中心由三元组唯一确定:namespace、group、service/dataId

不同的namesapce、group都是相互隔离的

4.1、配置namespace和group

  • 配置namespace

    image.png

  • 配置group

    group直接在代码里指定,不需要配置

4.2、发布服务到不同namespace&group

只需修改配置即可,下面将goods服务一个节点放到dev下

spring:
  application:
    name: cloud-goods # 服务名
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 指定nacos-server的地址
        username: nacos
        password: nacos
        namespace: dev # 服务发布到指定的namespace,默认是public
        group: my-group # 服务发布到指定的group,默认是DEFAULT_GROUP

server:
  port: 9002

image.png

测试服务调用,由于不属于同一个namespace所以,无法被调用了

image.png

五、Nacos集群简述

集群由DNS域名进入----->nginx负载分配到不同nacos节点上

image.png
  • 在nginx里配置,三个服务对应一个路径

    upstream nacos-cluster {
        server 127.0.0.1:8845;
        server 127.0.0.1:8846;
        server 127.0.0.1:8847;
    }
    
    server {
        listen       80;
        server_name  www.test.com;
    
        location /nacos {
            proxy_pass http://nacos-cluster;
        }
    }
    
  • 在服务注册时,把配置文件的server-addr: localhost:8848换成域名

    spring:
      application:
        name: cloud-goods # 服务名
      cloud:
        nacos:
          discovery:
            server-addr: www.test.com/nacos # 指定nacos-server的地址
            username: nacos
            password: nacos
    
    server:
      port: 9002