Spring Cloud Alibaba Nacos 服務發現
- 前言
- 一、服務發現原理
- 1、什么是服務發現?
- 2、如何實作服務發現?
- 3、缺點
- 4、解決方案
- 5、實作思路
- 6、方案升級
- 二、Nacos 簡介與環境搭建
- 1、Nacos 簡介
- 2、Nacos 下載與安裝
- 三、服務提供者與消費者整合 Nacos
- 1.1創建基于Maven的多模塊專案
- 1.2 創建服務提供者模塊(service-provider)與消費者模塊(service-consumer)
- 1.3 服務提供者(service-provider)模塊匯入依賴如下:
- 1.4 消費者(service-consumer)模塊匯入依賴如下:
- 1.5 我們先來完善提供者(service-provider)吧!
- 1.2.1 結構如下:
- 1.6 接下來完善消費者吧(service-consumer)!
- 1.3.1 結構如下:
- 1.7 啟動Nacos,啟動提供者(service-provider)與消費者(service-consumer)檢驗整合是否成功
- 四、Nacos 設計模型
- 1、Nacos 三層資料模型
- 2、Nacos 服務領域模型
- 3、Nacos 服務領域模型實踐
- 總結
前言
深夜肝文章不易,如果您有所識訓,請予以點贊支持,后續三此將為您提供SpringCloud Alibaba 更多的詳細教程,您的點贊與支持是對我最大的鼓勵!如對本章內容有疑問點,請與我聯系,我將在收到訊息的第一時間回復您,謝謝!提示:以下是本篇文章正文內容,下面案例可供參考
一、服務發現原理
1、什么是服務發現?
服務消費者怎么找到服務提供者的機制便是服務發現,

2、如何實作服務發現?
最簡單的方法便是: 把A當作一個通訊錄 ,
它記錄了B的資訊,把B的電話號碼記載了自己的程式中,想要聯系某人,打開通訊錄撥通號碼就可以了,

3、缺點


4、解決方案

5、實作思路

6、方案升級
1、方案升級 - 健康檢查
問題:服務實體故障了,無法主動注銷自己的資訊怎么辦?

方案:通過心跳機制進行健康檢查,注冊中心洗掉無心跳的實力資訊,

2、方案升級 - 本地快取
問題:每次服務呼叫之前都查詢注冊中心,性能差、不可靠,怎么辦?

方案:本地快取、定時更新

3、方案升級 - 資料同步
問題:注冊中心集群中各個節點的資料如何同步?

方案:
- 強一致性,例如 ZooKeeper
- 弱一致性,例如 Eureka
重難點:
- 服務發現(一個服務如何找到另一個服務)
- 實作服務發現機制需要解決很多問題(心跳健康檢查、本地快取、資料同步…)
二、Nacos 簡介與環境搭建
把 Nacos 跑起來!

1、Nacos 簡介
什么是 Nacos?
- Nacos 用于服務的注冊發現與服務的配置管理
- Nacos 提供了簡單易用的 Web Console,可以幫助開發者快速的實作服務發現、服務配置管理、服務元資料等需求,
- 官方檔案: https://nacos.io/zh-cn/docs/what-is-nacos.html
- 基本架構及概念:

Nacos (配置中心與服務注冊與發現)
Nacos 實作了服務的配置中心與服務注冊發現的功能,適配SpringCloud標準的服務注冊與服務發現標準,默認集成ribbon,
Nacos 可以通過可視化的配置降低相關的學習與維護成本,實作動態的配置管理與分環境的配置中心控制,
同時Nacos提供了基于http/RCP的服務注冊與發現功能,
官方網站地址 https://nacos.io/zh-cn/

2、Nacos 下載與安裝
下載地址:https://github.com/alibaba/nacos/releases/tag/1.4.1

下載完畢后解壓
解壓后檔案如下:

打開bin目錄
啟動 Nacos:

獲得控制臺的訪問路徑
http://192.XXX.XXX.X:8848/nacos/index.html

使用瀏覽器訪問控制臺
賬號:nacos
密碼:nacos

成功進入 Nacos 控制臺:

三、服務提供者與消費者整合 Nacos
1.1創建基于Maven的多模塊專案


1.2 創建服務提供者模塊(service-provider)與消費者模塊(service-consumer)

1.3 服務提供者(service-provider)模塊匯入依賴如下:
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>service-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>service-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- todo 1. 加依賴 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.4 消費者(service-consumer)模塊匯入依賴如下:
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>service-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>service-consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- todo 1. 加依賴 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.5 我們先來完善提供者(service-provider)吧!
1.2.1 結構如下:

匯入yaml檔案:
server:
port: 8081
spring:
application:
name: service-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
# todo 3. 改配置(添加 nacos 地址)
服務提供者(service-provider)啟動類代碼如下:
package com.example.serviceprovider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
// todo 2. 加注解(開啟服務發現)
@EnableDiscoveryClient
public class ServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceProviderApplication.class, args);
}
}
服務提供者(service-provider)Controller代碼如下:
package com.example.serviceprovider;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
// todo 4. 創建測驗介面
@GetMapping("hello")
public String hello(@RequestParam String name){
return "hello " + name;
}
}
1.6 接下來完善消費者吧(service-consumer)!
1.3.1 結構如下:

匯入yaml檔案:
server:
port: 8082
spring:
application:
name: service-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
# todo 3. 改配置(添加 nacos 地址)
消費者(service-consumer)啟動類代碼如下:
package com.example.serviceprovider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
// todo 2. 加注解(開啟服務發現)
@EnableDiscoveryClient
public class ServiceConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceConsumerApplication.class, args);
}
}
消費者(service-consumer)配置類代碼如下:
package com.example.serviceprovider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ConsumerConfig {
// todo 4. 配置 RestTemplate
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
消費者(service-consumer)Controller代碼如下:
package com.example.serviceprovider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.net.URI;
// todo 5. 發起服務呼叫
@RestController
public class TestController {
// 引入 RestTemplate
@Autowired
RestTemplate restTemplate;
// 引入 LoadBalancerClient
@Autowired
LoadBalancerClient loadBalancerClient;
@GetMapping("hello")
public String hello(@RequestParam String name) {
String result = "";
// 根據服務名獲取服務實體
ServiceInstance serviceInstance = loadBalancerClient.choose("service-provider");
// 發起呼叫
URI uri = serviceInstance.getUri();
result = restTemplate.getForObject(uri + "/hello?name=test", String.class);
// 回傳結果
return result;
}
}
1.7 啟動Nacos,啟動提供者(service-provider)與消費者(service-consumer)檢驗整合是否成功
啟動服務:

啟動 Nacos :

訪問 Nacos 控制臺:

效果如下:

四、Nacos 設計模型
阿里在多年的實踐中總結出了資料模型、領域模型,對我們的實際應用提供了寶貴的經驗和便利,
本節我們就學習一下相關的重要概念,并通過實踐操作來加深理解,
1、Nacos 三層資料模型

2、Nacos 服務領域模型

3、Nacos 服務領域模型實踐
Nacos 控制臺中新建一個命名空間“dev”

創建一個新的服務,設定其命名空間、組、集群,
spring:
application:
name: service-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: a72b2b1d-4850-40d3-b831-6f21b3f3626f
group: group01
cluster-name: BJ
啟動效果如下:

總結
Nacos 提供了一組簡單易用的特性集,幫助我們快速實作動態服務發現、服務配置、服務元資料及流量管理,更敏捷和容易地構建、交付和管理微服務平臺,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/279563.html
標籤:其他
