SpringCloud Alibaba之Nacos

一、SpringCloud Alibaba

SpringCloud Alibaba官网:https://github.com/alibaba/spring-cloud-alibaba/blob/2.2.x/README-zh.md

SpringCloud Alibaba为什么会出现?
spring cloud Netflix进入维护模式
1.有什么用处?
在这里插入图片描述
2.有哪些组件?
在这里插入图片描述

二、Nacos

1.Nacos是一个更易于构建云远程应用的动态服务发现,配置管理和服务管理平台。
2.代替Eureka做注册中心,代替Config做配置中心,即Nacos = Eureka + Config + Bus
3.Nacos下载安装:Nacos官网下载安装
百度网盘链接:https://pan.baidu.com/s/17F4yz-GxBSqsgvaRK1ABmA 密码:1usz
尚硅谷SpringCloud Alibaba
4.Nacos支持AP模式和CP模式切换,C是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应。

什么是CAP理论?
C:Consistency 一致性:数据在多个副本之间是否能够保持一致的特性。
A:Availability 可用性:系统提供的服务必须一直处于可用状态,对每一个操作的请求必须在有限时间内返回结果。
P:Tolerance of network Partition 分区容错性:分布式系统在遇到网络分区故障时,仍然需要保证对外提供一致性和可用性的服务,除非整个网络都发生故障。

5.Nacos与其他注册中心的对比
在这里插入图片描述

三、如何使用Nacos?

父项目pom.xml

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <junit.version>4.12</junit.version>
    <log4j.version>1.2.17</log4j.version>
    <lombok.version>1.16.18</lombok.version>
    <mysql.version>5.1.47</mysql.version>
    <druid.version>1.1.16</druid.version>
    <mybatis.spring.boot.version>1.3.2</mybatis.spring.boot.version>
</properties>
<!-- 子模块继承之后,提供作用:锁定版本+子模块不用写groupId和version  -->
<dependencyManagement>
    <dependencies>
        <!--  springboot 2.2.2    -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.2.2.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--  springcloud cloud Hoxton.SR1   -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--  springcloud cloud alibaba 2.1.0.RELEASE    -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.1.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis.spring.boot.version}</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <optional>true</optional>
        </dependency>
    </dependencies>
</dependencyManagement>
<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>

1.服务提供者注册
新建服务提供者:nacos-payment-provider9001
① pom.xml

<properties>
    <java.version>1.8</java.version>
    <spring.cloud.alibaba.version>2.2.1.RELEASE</spring.cloud.alibaba.version>
</properties>

<dependencies>
    <!--  SpringCloud alibaba nacos    -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!--  web组件      -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>

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

② application.yml

server:
  port: 9001 #端口号
spring:
  application:
    name: nacos-payment-provider #服务名称
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置nacos地址
management:
  endpoints:
    web:
      exposure:
        include: "*" #监控的东西

③ 启动类PaymentMain9001.java

@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9001 {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(PaymentMain9001.class,args);
    }
}

2.服务消费者和负载均衡
Nacos自动集成了负载均衡。
在父工程下,再创建一个服务提供者:nacos-payment-provider9002注册。然后创建一个服务消费者:consumer-nacos-order80
① pom.xml

<dependencies>
    <!--  SpringCloud alibaba nacos    -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!--  web组件      -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

② application.yml

server:
  port: 80
  undertow:
    decode-url:
spring:
  application:
    name: consumer-nacos-order
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
server-url:
  nacos-user-service: http://nacos-payment-provider #消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)

③ 配置类

//配置类
@Configuration
public class ApplicationContextConfig {
    
    
    @Bean
    @LoadBalanced  //负载均衡
    public RestTemplate getRestTemplate(){
    
    
        return new RestTemplate();
    }
}

④ 业务类controller

@RestController
@Slf4j
public class NacosOrderController {
    
    
    @Resource
    private RestTemplate restTemplate;
    @Value("${server-url.nacos-user-service}")
    private String serverUrl;  //在yml里面写的提供者服务路径,  值为:http://nacos-provider
    @GetMapping(value="consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") int id)
    {
    
    
        return restTemplate.getForObject(serverUrl+"/payment/nacos/"+id,String.class);
    }
}

⑤ 启动类

@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerNacosOrder80 {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(ConsumerNacosOrder80.class,args);
    }
}

分别启动服务提供者9001和9002,服务消费者80,启动Nacos,访问Nacos可以看到服务注册成功。
在这里插入图片描述
在浏览器中访问服务消费者:http://localhost:80/consumer/payment/nacos/1001,不断刷新访问,可以看到实现了消费者的负载均衡(轮询)。
在这里插入图片描述
3.Nacos作为分布式配置中心
① pom.xml

<dependencies>
    <!--   nacos config     -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <!--  SpringCloud alibaba nacos    -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!--  web组件      -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-context</artifactId>
    </dependency>
</dependencies>

② 配置文件:bootstrap.yml

# nacos 配置
server:
  port: 3377
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848  #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #nacos作为配置中心的地址
        file-extension: yaml  # 指定yaml格式的配置

③ 配置文件:application.yml

spring:
  profiles:
    active: dev

需要在Nacos中新建的配置文件的名字,遵循下列规则,拼接后的结果是:nacos-config-client-dev.yaml
在这里插入图片描述
在Nacos中创建名为:nacos-config-client-dev.yaml的配置文件。
nacos-config-client-dev.yaml
④ 业务controller

@RestController
@RefreshScope   //开启刷新,否则分布式配置不会生效
public class ConfigCenterController {
    
    
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo()
    {
    
    
        return configInfo;
    }
}

⑤ 启动类:

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigMain3377 {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(NacosConfigMain3377.class,args);
    }
}

启动服务配置中心微服务,访问:http://localhost:3377/config/info,可以看到Nacos中配置的信息已经读取到。
在这里插入图片描述
自带动态刷新,若在Nacos中修改配置文件的信息,再次刷新,访问到的配置信息也会自动刷新。
在这里插入图片描述
4.Nacos之命名空间、分组和DataID的关系
是什么?
类似Java里面的package名和类名。最外层的namespace是可以用于区分部署环境的,Group和DataID逻辑上区分两个目标对象。
在这里插入图片描述
三者情况
默认情况:namespace=public,group=default_group,默认cluster是default。
比方说我们有三个环境:开发、测试、生产环境,我们就可以创建三个namespace,不同的namespace是隔离的。

三种方案加载配置

(1)Nacos之DataID配置
在这里插入图片描述
(2)Nacos之group分组
在这里插入图片描述
(3)Nacos之namespace空间方案
在这里插入图片描述

Nacos集群的搭建

Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。
Nacos支持的三种部署模式:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_46081857/article/details/123690976