一、架構的演變(圖參考自螞蟻課堂)
1、單體應用架構
這種架構部署很簡單,像SSM框架就是典型的例子,運維人員共各地不需要太深功力。但是這種架構很有問題,代碼耦合度極高,只要一點需求變動,就要重新打包部署,整個系統期間都處於不可用狀態,而且沒有對業務邏輯代碼進行拆分,代碼都擠在一起。
2、分佈式架構
這種架構將業務進行了粗粒度的拆分,不同業務直接寫在不同系統上面,一定程度上降低了代碼的耦合度。
3、SOA架構模式(Service-Oriented Architecture)
面向與接口開發,將共同存在的業務邏輯抽取成一個共同的服務,提供給其他的服務接口實現調用、服務與服務之間通訊採用rpc遠程調用技術。基於SOAP協議(HTTP+XML),數據冗餘量非常大。
4、微服務架構
每個服務都可以單獨運行,服務與服務通訊協議採用Http協議,使用restful風格API形式來進行通訊,數據交換格式輕量級json格式通訊,整個傳輸過程中,採用二進制,所以http協議可以跨語言平臺,
二、服務發現
1、父工程引入以下pom.xml(直接用了最新的版本)
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR4</spring-cloud.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- <exclusions>-->
<!-- <exclusion>-->
<!-- <groupId>com.fasterxml.core</groupId>-->
<!-- <artifactId>jackson-databind</artifactId>-->
<!-- </exclusion>-->
<!-- </exclusions>-->
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<!-- <exclusions>-->
<!-- <exclusion>-->
<!-- <groupId>com.fasterxml.jackson.dataformat</groupId>-->
<!-- <artifactId>jackson-dataformat-xml</artifactId>-->
<!-- </exclusion>-->
<!-- </exclusions>-->
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2、啓動nacos
windows雙擊startup.cmd,Linux運行startup.sh。默認端口是8848.
3、配置生產者和消費者的配置文件
生產者配置文件:
spring.application.name=member-service #往nacos註冊的服務名稱
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 #nacos可視化界面所在的端口
server.port=8081 #該服務部署的端口
消費者配置文件:
spring.application.name=order-service #往nacos註冊的服務名稱
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 #nacos可視化界面所在的端口
server.port=9090 #該服務部署的端口
4、測試nacos註冊中心
三、分佈式配置中心
重點(純屬個人見解):
首先,必須要搞清楚分佈式配置中心要解決的問題—集羣部署的時候可以動態修改配置,不需要重啓服務器。微服務集羣部署特點:都是註冊到nacos上,服務名稱一致,IP或者端口號不同,所以通過RPC遠程調用的時候會有本地的負載均衡算法,算法本質還是從nacos註冊中心根據提供的服務名稱取到一個IP地址的集合。OK,有了這些基礎,看下面代碼應該so easy。
1、父工程繼續添加依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2、config服務添加配置
分佈式配置中心寫在bootstrap文件中,而服務註冊和發現寫在SpringBoot常見的配置文件中。bootstrap.yml 用於應用程序上下文的引導階段。application.yml 由父Spring ApplicationContext加載。而連接nacos分佈式配置中心一定需要優先加載。
application.properties文件配置:
spring.application.name=config-service #看完之前說的重點, 應該明白了這個爲什麼要和bootstrap中服務名稱一致了
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
server.port=8888
spring.main.allow-bean-definition-overriding=true
bootstrap.properties文件配置:
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=config-service #看完之前說的重點, 應該明白了這個爲什麼要和bootstrap中服務名稱一致了
spring.profiles.active=dev
spring.cloud.nacos.config.file-extension=yaml #嚴格區分yml和yaml, 配置中心配置的格式只能是yaml
#${spring.application.name}-${spring.profile.active}.${file-extension}
不理解${spring.application.name}-${spring.profile.active}.${file-extension}的看下圖。
運行,報錯,不用慌。
Description:
The bean 'nacosConfigProperties', defined in class path resource [com/alibaba/cloud/nacos/NacosConfigBootstrapConfiguration.class], could not be registered. A bean with that name has already been defined in class path resource [org/springframework/cloud/alibaba/nacos/NacosConfigBootstrapConfiguration.class] and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
配置文件中添加:
spring.main.allow-bean-definition-overriding=true
加上後,發現沒屌用。又仔細查看了pom.xml,終於找到了問題根源,父工程和子工程引入依賴版本不一致造成的。去掉子工程的老版本。
3、測試代碼
@RestController
@RefreshScope //動態刷新nacos配置中心所配置的文件中的數據, 一定要加載本類上(不要加在啓動類上)
public class ConfigController {
@Value("${meeting.msg}")
private String message;
@GetMapping("/config")
public String getMessage() {
return message;
}
}
4、測試
經測試後,加上@RefreshScope註解後已經可以動態刷新加載配置了。