SpringCloud---nacos(服務註冊中心、分佈式配置中心)

一、架構的演變(圖參考自螞蟻課堂)

1、單體應用架構

       這種架構部署很簡單,像SSM框架就是典型的例子,運維人員共各地不需要太深功力。但是這種架構很有問題,代碼耦合度極高,只要一點需求變動就要重新打包部署整個系統期間都處於不可用狀態,而且沒有對業務邏輯代碼進行拆分,代碼都擠在一起。

Alt

2、分佈式架構

       這種架構將業務進行了粗粒度的拆分,不同業務直接寫在不同系統上面,一定程度上降低了代碼的耦合度。

Alt

3、SOA架構模式(Service-Oriented Architecture)

       面向與接口開發,將共同存在的業務邏輯抽取成一個共同的服務,提供給其他的服務接口實現調用、服務與服務之間通訊採用rpc遠程調用技術。基於SOAP協議(HTTP+XML),數據冗餘量非常大

Alt

4、微服務架構

       每個服務都可以單獨運行,服務與服務通訊協議採用Http協議,使用restful風格API形式來進行通訊,數據交換格式輕量級json格式通訊,整個傳輸過程中,採用二進制,所以http協議可以跨語言平臺

Alt





二、服務發現

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.

Alt



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註冊中心

Alt





三、分佈式配置中心

重點(純屬個人見解):
       首先,必須要搞清楚分佈式配置中心要解決的問題—集羣部署的時候可以動態修改配置,不需要重啓服務器。微服務集羣部署特點:都是註冊到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}的看下圖。

Alt

運行,報錯,不用慌。

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

Alt



4、測試

經測試後,加上@RefreshScope註解後已經可以動態刷新加載配置了。

Alt

學習鏈接資源:http://www.mayikt.com/front/couinfo/247/0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章