為什么需要注冊中心?
在分布式架構中,服務會注冊到這里,當服務需要調用其它服務時,就到這里找到服務的地址,進行調用;服務管理,核心是有個服務注冊表,心跳機制動態維護 ;
服務注冊
創建普通SpringBoot工程(spring-cloud-alibaba-service-user)該工程當前用於使用Nacos進行服務注冊。
pom.xml
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gitee</groupId>
<artifactId>spring-cloud-alibaba-service-user</artifactId>
<version>0.0.1</version>
<dependencyManagement>
<dependencies>
<!-- 依賴管理父工程 -->
<dependency>
<groupId>com.gitee</groupId>
<artifactId>spring-cloud-alibaba-version-parent</artifactId>
<version>${project.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- 公共模塊 -->
<dependency>
<groupId>com.gitee</groupId>
<artifactId>spring-cloud-alibaba-common</artifactId>
<version>${project.version}</version>
</dependency>
<!-- web服務 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- undertow服務器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
<!-- 參數校驗 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- nacos 服務治理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- nacos 配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- openfeign 服務發現調用 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
</project>
application.yaml
server:
port: 8080
spring:
application:
name: service-user
cloud:
nacos:
discovery:
#注冊中心地址
server-addr: localhost:8848
#服務元數據
metadata:
version: 0.0.1
appname: ${spring.application.name}
UserServiceApplication.java
/**
* 用戶中心服務啟動類
*
* @author wentao.wu
*/
@EnableDiscoveryClient//服務注冊
@SpringBootApplication
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
HelloWorldController.java
/**
* HelloWorld Web
*
* @author wentao.wu
*/
@RequestMapping(value = "/hello/")
@RestController
public class HelloWorldController {
@GetMapping("/say/{name}")
public Response<String> say(@PathVariable("name") String name) {
Response<String> response = new Response<>();
response.setCode("1");
response.setMsg("你好啊," + name + "!");
return response;
}
}
以上內容是整個工程當前的內容,直接運行訪問:http://localhost:8080/hello/say/nacos,后者輸出:
{
"code": "1",
"msg": "你好啊,nacos!",
"errorCode": null,
"errorMsg": null,
"result": null
}
看到以上返回內容代表整個服務完全啟動成功。進入nacos管理界面:http://localhost:8848/nacos 默認登錄賬號與密碼為 nacos/nacos
進入服務管理菜單->服務列表就能夠看到我們注冊進去的服務。
點擊詳情即可查看服務元數據:
從Nacos之中服務列表能夠看到我們所注冊的服務意味這服務已經注冊到Nacos Server端。
多環境服務隔離
用於進行租戶粒度的配置隔離。不同的命名空間下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生產環境的資源(如配置、服務)隔離等。
在資源不夠的情況下,開發環境(dev),綜合測試環境(sit),業務測試環境(uat)通常會公用一套Nacos Server,使用Namespace 來區分環境,然后再通過dataID來指定每個服務的配置文件,這樣就可以每個環境的服務注冊發現不會相互干擾,並且也不會用到其他環境的配置文件。
創建命名空間
從Nacos菜單中命名空間點擊新建命名空間,輸入空間名稱與描述,命名空間ID可填可不填,不填則會自動生成一串UUID的字符。
記錄自動生成的命名空間ID:7e3699fa-09eb-4d47-8967-60f6c98da94a
工程使用對應的命名空間
application.yaml
server:
port: 8080
spring:
application:
name: service-user
cloud:
nacos:
discovery:
server-addr: localhost:8848
metadata:
version: 0.0.1
appname: ${spring.application.name}
#指定命名空間 對應dev環境
namespace: 7e3699fa-09eb-4d47-8967-60f6c98da94a
#指定分組 案例組
group: EXAMPLE-GROUP
#指定集群環境 華南
cluster-name: HuaNan
這里添加了3個配置。
Namespace:使用dev環境的命名空間id指定該服務部署在dev環境下與其他命名空間服務進行隔離。
Group: 標識該服務屬於哪個項目組。
Cluster-name:標識該服務部署在華南地區。
Nacos Server最終由namespace->group->ServiceID->Cluster-name獲取到對應的服務實例列表。
配置好之后運行UserServiceApplication.java對服務進行重啟,重啟之后服務將重新注冊到Nacos中並且在Web界面服務列表中Dev命名空間進行顯示。
注意事項
Namespace與Group配置后只有Namespace與Group相同的才能夠算作一套系統,只有同一套系統才能夠內部進行快速訪問,如使用feign進行遠程調用時,GROUP=金融系統與GROUP=電商系統兩個不同的GROUP在其中是不能夠直接通過Feign服務發現進行訪問的,對應的業務服務只會發現對應Namespace與Group中的服務。
源碼代碼存放地址
gitee: https://gitee.com/SimpleWu/spring-cloud-alibaba-example.git
cnblogs: https://www.cnblogs.com/SimpleWu
持續更新目錄:https://www.cnblogs.com/SimpleWu/p/15476427.html