SpringCloud Alibaba (二):Nacos 註冊中心

SpringCloud Alibaba (二):Nacos 註冊中心

什麼是 Nacos?

服務(Service)是 Nacos 世界的一等公民。Nacos 支持幾乎全部主流類型的「服務」的發現、配置和管理:html

Kubernetes Servicejava

gRPC & Dubbo RPC Servicegit

Spring Cloud RESTful Servicegithub

Nacos 的關鍵特性包括:web

  • 服務發現和服務健康監測spring

    Nacos 支持基於 DNS 和基於 RPC 的服務發現。服務提供者使用 原生SDKOpenAPI、或一個獨立的Agent TODO註冊 Service 後,服務消費者可使用DNS TODOHTTP&API查找和發現服務。apache

    Nacos 提供對服務的實時的健康檢查,阻止向不健康的主機或服務實例發送請求。Nacos 支持傳輸層 (PING 或 TCP)和應用層 (如 HTTP、MySQL、用戶自定義)的健康檢查。 對於複雜的雲環境和網絡拓撲環境中(如 VPC、邊緣網絡等)服務的健康檢查,Nacos 提供了 agent 上報模式和服務端主動檢測2種健康檢查模式。Nacos 還提供了統一的健康檢查儀表盤,幫助您根據健康狀態管理服務的可用性及流量。bootstrap

  • 動態配置服務ubuntu

    動態配置服務可讓您以中心化、外部化和動態化的方式管理全部環境的應用配置和服務配置。安全

    動態配置消除了配置變動時從新部署應用和服務的須要,讓配置管理變得更加高效和敏捷。

    配置中心化管理讓實現無狀態服務變得更簡單,讓服務按需彈性擴展變得更容易。

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

 

 

個人我的博客站

相關文章
相關標籤/搜索