SpringCloud Alibaba (二):Nacos 注册中心

SpringCloud Alibaba (二):Nacos 注册中心

什么是 Nacos?

服务(Service)是 Nacos 世界的一等公民。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:

Kubernetes Service

gRPC & Dubbo RPC Service

Spring Cloud RESTful Service

Nacos 的关键特性包括:

  • 服务发现和服务健康监测

    Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDKOpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODOHTTP&API查找和发现服务。

    Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

  • 动态配置服务

    动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。

    动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。

    配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。

    Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

  • 动态 DNS 服务

    动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。

    Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.

  • 服务及其元数据管理

    Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

nacos

Nacos下载

1.预备环境准备

Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:

  1. 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。

  2. 64 bit JDK 1.8+;下载 & 配置

  3. Maven 3.2.x+;下载 & 配置

2.下载源码或者安装包

你可以通过源码和发行包两种方式来获取 Nacos。

从 Github 上下载源码方式

git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U  
ls -al distribution/target/# change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin

下载编译后压缩包方式

您可以从 最新稳定版本 下载 nacos-server-$version.zip 包。

unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz

cd nacos
/bin

3.启动服务器

Linux/Unix/Mac

启动命令(standalone代表着单机模式运行,非集群模式):

sh startup.sh -m standalone

如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:

bash startup.sh -m standalone

Windows

启动命令:

cmd startup.cmd

或者双击startup.cmd运行文件。

4.访问nacos注册中心

访问地址(nacos默认启动端口为8848):nacos启动主机ip:8848/nacos

如: 在本机启动就是 localhost:8848/nacos

 

在SpringCloud Alibaba项目中使用Nacos

服务提供者

1.创建服务提供者,并导入依赖

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>SpringCloudAlibaba</artifactId>
        <groupId>com.gofy.alibaba</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-alibaba-provider8070</artifactId>
    <packaging>jar</packaging>

    <properties>
        <nacos-discovery.version>2.1.0.RELEASE</nacos-discovery.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <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>
            <version>${nacos-discovery.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.gofy.alibaba.Provider8070</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2.在application.yaml配置文件中添加配置

server:
  port: 8070

spring:
  application:
    name: provider-8070 #服务名
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.11.132:8848 # 启动nacos的主机ip:端口

# 暴露服务的端点
management:
  endpoints:
    web:
      exposure:
        include: "*"

3.在启动类上添加注解@EnableDiscoveryClient, 开启服务发现

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

4.创建controller类

@RestController
public class ProviderController {

    @GetMapping("/echo/{string}")
    public String echo(@PathVariable("string")String string){
        return "Hello Nacos Discovery "+string;
    }

}

服务消费者

1.创建服务消费者,并导入依赖

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>SpringCloudAlibaba</artifactId>
        <groupId>com.gofy.alibaba</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-alibaba-consumer8080</artifactId>
    <packaging>jar</packaging>

    <properties>
        <nacos-discovery.version>2.1.0.RELEASE</nacos-discovery.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <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>
            <version>${nacos-discovery.version}</version>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.gofy.alibaba.Consumer8080</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2.在application.yaml配置文件中添加配置

server:
  port: 8080

spring:
  application:
    name: consumer-8080 # 服务名
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.11.132:8848 # 启动nacos的主机ip:端口
        
# 暴露服务端点
management:
  endpoints:
    web:
      exposure:
        include: "*"

3.在启动类上添加注解@EnableDiscoveryClient,开启服务发现

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

4.调用服务提供者,有俩种调用方法:RestTemplatefeign

  • 使用RestTemplate调用服务提供者

创建配置类, 把RestTemplate加入容器中,方便注入

@Configuration
public class ConsumerConfig {
    @Bean
    @LoadBalanced //nacos-discovery整合了ribbon,所以可以使用ribbon的负载均衡
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

创建controller

@RestController
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/echo/{string}")
    public String echo(@PathVariable("string")String string){
        return restTemplate.getForObject("http://provider-8070/echo/"+string, String.class);
    }

}
  • 使用feign调用服务提供者

添加feign依赖

注意:因为spring-cloud-starter-alibaba-nacos-discoveryspring-cloud-starter-openfeign都带有archaius-core包,所以整合nacos-discovery和openfeign组件时,需要除去openfeign中的archaius-core包, 否则会有冲突而导致openfeign或nacos-discovery异常

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>2.1.0.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>com.netflix.archaius</groupId>
            <artifactId>archaius-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

在启动类上添加注解@EnableFeignClients

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

创建对应服务的接口

@FeignClient(name = "provider-8070") //name对应要调用服务的服务名(spring.application.name)
public interface EchoService {

    //对应调用服务controller里的方法
    @GetMapping("/echo/{string}")
    String echo(@PathVariable("string")String string);

}

创建controller

@RestController
public class FeignController {

    @Autowired
    private EchoService echoService;

    @GetMapping("/feign/echo/{string}")
    public String echo(@PathVariable("string")String string){
        return echoService.echo(string);
    }

}

访问nacos注册中心

启动服务消费者和服务提供者后,可以在服务列表查看到已注册的服务



Nacos动态配置

Nacos 提供了一个简洁易用的UI帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

nacos注册中心添加配置

点击nacos注册中心配置列表右上角的加号添加配置, 把之前服务消费者application.yml文件里的配置移到nacos服务中心,添加完后删除服务消费者的application.yml文件

注意:配置内容不能有注释,否则会报错

服务添加配置

添加nacos动态配置的依赖

<nacos-config.version>2.1.0.RELEASE</nacos-config.version><!-- nacos动态配置 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>${nacos-config.version}</version>
</dependency>

在consumer-8080服务创建 bootstrap.properties ,添加配置

spring.application.name=consumer-8080-config #服务中心上的服务配置文件名,不用加后缀
spring.cloud.nacos.config.server-addr=192.168.11.132:8848 #服务中心地址
spring.cloud.nacos.config.file-extension=yaml #服务中心上的服务配置文件格式

在controller类上添加 @RefreshScope 开启实时获取最新配置

@RefreshScope
@RestController
public class FeignController {
    @Autowired
    private EchoService echoService;
​
    @GetMapping("/feign/echo/{string}")
    public String echo(@PathVariable("string")String string){
        return echoService.echo(string);
    }
​
}

 

 

我的个人博客站

posted @ 2020-06-13 23:14  小高飞  阅读(456)  评论(0编辑  收藏  举报