Loading

03_Nacos Client端使用

Spring Cloud Alibaba Nacos快速开始

Spring Cloud Alibaba版本选型:
#版本说明:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

父工程pom文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.yyj.mall</groupId>
    <artifactId>spring-cloud-alibaba-nacos</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-cloud-alibaba-nacos</name>
    <packaging>pom</packaging>
    <modelVersion>4.0.0</modelVersion>

    <description>Demo project for vip-spring-cloud-alibaba</description>

    <modules>
        <module>mall-common</module>
        <module>mall-user</module>
        <module>mall-order</module>
    </modules>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
        <spring-cloud-alibaba.version>2.2.8.RELEASE</spring-cloud-alibaba.version>
    </properties>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>
View Code

微服务(Nacos Client)整合Nacos注册中心(Nacos Server)

配置服务提供者mall-order服务提供者可以通过 Nacos 的服务注册发现功能将其服务注册到 Nacos server 上。
1)引入依赖
当前项目pom中引入依赖
        <!-- nacos服务注册与发现 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
配置nacos注册中心 
server:
  port: 8020

spring:
  application:
    name: mall-order  #微服务名称

  #配置nacos注册中心地址
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.3.100:8848,192.168.3.101:8848,192.168.3.102:8848
更多配置请参考:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery

启动mall-order,nacos管理端界面查看是否成功注册:

测试,通过Open API查询实例列表:

配置服务消费者mall-user:
服务消费者可以通过 Nacos 的服务注册发现功能从 Nacos server 上获取到它要调用的服务。
1)引入依赖
当前项目pom中引入依赖
        <!-- nacos服务注册与发现 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
配置nacos注册中心
server:
  port: 8040

spring:
  application:
    name: mall-user  #微服务名称

  #配置nacos注册中心地址
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.3.100:8848,192.168.3.101:8848,192.168.3.102:8848
启动mall-user,nacos管理端界面查看是否成功注册

使用RestTemplate进行服务调用
给 RestTemplate 实例添加 @LoadBalanced 注解,开启 @LoadBalanced 与 Ribbon 的集成
@Configuration
public class RestConfig {

    @Bean
    @LoadBalanced  // 微服务名替换为具体的ip:port
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

}
调用逻辑
#使用微服务名发起调用
String url = "http://mall-order/order/findOrderByUserId/"+id;
List<Order> orderList = restTemplate.getForObject(url, List.class);

测试:http://localhost:8040/user/findOrderByUserId/1,返回数据:

Nacos注册中心常见配置:

服务分级存储模型

注册中心的核心数据是服务的名字和它对应的网络地址,当服务注册了多个实例时,我们需要对不健康的实例进行过滤或者针对实例的㇐些特征进行流量的分配,那么就需要在实例上存储㇐些例如 健康状态、权重等属性。随着服务规模的扩大,渐渐的又需要在整个服务级别设定㇐些权限规则、 以及对所有实例都生效的㇐些开关,于是在服务级别又会设立㇐些属性。再往后,我们又发现单个 服务的实例又会有划分为多个子集的需求,例如㇐个服务是多机房部署的,那么可能需要对每个机 房的实例做不同的配置,这样又需要在服务和实例之间再设定㇐个数据级别。
Nacos 在经过内部多年生 产经验后提炼出的数据模型,则是㇐种服务-集群-实例的三层模型。这样基本可以满足 服务在所有场景下的数据存储和管理。

服务逻辑隔离
Nacos 数据模型 Key 由三元组(namespace-group-service)唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。 

命名空间(Namespace)用于进行租户(用户)粒度的隔离,Namespace 的常用场景之一是不同环境的隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

修改yml配置
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.3.100:8848,192.168.3.101:8848,192.168.3.102:8848
        namespace: d03abad8-acbc-46a5-8f6c-b45bf8c84e6e # dev 开发环境
测试:http://localhost:8040/user/findOrderByUserId/1,报错,原因:mall-order和mall-user使用了不同的namespace,导致服务隔离。 

group服务分组

不同的服务可以归类到同一分组,group也可以起到服务隔离的作用。yml中可以通过spring.cloud.nacos.discovery.group参数配置。

临时实例和持久化实例

在定义上区分临时实例和持久化实例的关键是健康检查的方式。临时实例使用客户端上报模式,而持久化实例使用服务端反向探测模式。临时实例需要能够自动摘除不健康实例,而且无需持久化存储实例。持久化实例使用服务端探测的健康检查方式,因为客户端不
会上报心跳, 所以不能自动摘除下线的实例。在大中型的公司里,这两种类型的服务往往都有。㇐些基础的组件例如数据库、缓存等,这些往往不能上报心跳,这种类型的服务在注册时,就需要作为持久化实例注册。而上层的业务服务,例如 微服务或者 Dubbo 服务,服务的 Provider 端支持添加汇报心跳的逻辑,此时就可以使用动态服务的注册方式。

版本对比

Nacos 1.x 中持久化及非 持久化的属性是作为实例的㇐个元数据进行存储和识别。
Nacos 2.x 中继续沿用了持久化及非持久化的设定,但是有了㇐些调整。在 Nacos2.0 中将是否持久化的数据抽象至服务级别, 且不再允许㇐个服务同时存在持久化实例和非持久化实例,实例的持久化属性继承自服务的持久化属性。
# 持久化实例
spring.cloud.nacos.discovery.ephemeral: false

 

posted @ 2023-04-21 23:31  1640808365  阅读(221)  评论(0编辑  收藏  举报