目錄
一、前言
二、學(xué)習(xí)的內(nèi)容
一、Nacos的服務(wù)注冊/發(fā)現(xiàn)
1. 導(dǎo)依賴,nacos-discovery
java.lang.AbstractMethodError: org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.cho
2. 在application.yml中聲明nacos服務(wù)器的ip地址和端口號,以及指定好服務(wù)的名稱
3. 在啟動類上面加上@EnableDiscoverClient
二、Feign的遠(yuǎn)程調(diào)用
1. 導(dǎo)依賴,open-feign
2. 寫好聲明式接口
3. 在啟動類上面指定好聲明式接口的位置
三、Nacos的配置中心
1. 導(dǎo)依賴 nacos-cofig
2. 在配置中心中按照需求進行配置,然后在application.yml文件中聲明好nacos服務(wù)器的地址和服務(wù)名稱必要時配好其它參數(shù)
3. 注意點
四、GeteWay網(wǎng)關(guān)
三、完成的進度
四、總結(jié)
一、前言
首先得了解微服務(wù)的這一套解決方案可以通過哪些組件進行實現(xiàn),SpringCloud和SpringCloudAlibaba都是為了解決分布式中所出現(xiàn)的一些問題的,那這兩者有什么區(qū)別呢,實現(xiàn)就是說SpringCloud是Spring官方的,而SpringCloudAlibaba的阿里巴巴公司的,其實SpringCloud有一些組件其實已經(jīng)停止維護了,比如Eureka,而且許多組件配置起來很繁瑣,不方便,并且沒有提供可視化界面不易操作,而SpringCloudAlibaba提供的組件呢,步驟簡單,配置容易,并且還有可視化界面,容易直接獲取到信息。
微服務(wù)的組件很多,什么服務(wù)注冊,配置中心,網(wǎng)關(guān),服務(wù)容錯(熔斷降級),鏈路的追蹤,遠(yuǎn)程調(diào)用,負(fù)載均衡等一些微服務(wù)組件,今天主要學(xué)習(xí)的是在微服務(wù)中最為基礎(chǔ)的幾個組件,分別是使用Nacos的服務(wù)注冊/發(fā)現(xiàn)、Nacos的配置中心、Feign的遠(yuǎn)程調(diào)用、GeteWay網(wǎng)關(guān)。
二、學(xué)習(xí)的內(nèi)容
首先,使用了Alibaba的這些組件,可以在公共類中導(dǎo)入alibaba的dependencies,導(dǎo)入這個的目的就是為了統(tǒng)一的依賴的版本的控制,就是之后使用alibaba的那些組件就不需要顯式的寫版本號了。當(dāng)然也可以不寫,不寫的話就需要我們對其依賴需要標(biāo)明其版本號。
dependencies依賴如下:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
?這個只是一個結(jié)構(gòu)的參考,不但是cloud或者是cloudalibaba或者是boot都可以采用這種方式,注意要標(biāo)明類型為pom然后scope為import。告訴maven這其實不是真正的依賴,只是為了繼承的,為了聲明好版本號的。具體的這個版本號你要根據(jù)boot的版本還有cloud的版本來選擇合適的版本。我的boot版本是2.7.12的版本,cloud的版本是我在創(chuàng)建Boot項目的時候自動為我選擇的,但是我使用alibaba的組件的依賴的時候,我是沒有聲明alibaba的dependencies的,所以我在項目中需要自己為依賴手動的顯式指定好版本號,但是呢這個版本號,它比較的只能,通過我最初的boot版本idea可以自動的為我適配好alibaba組件的版本。
所以總結(jié)來說的話,對于這個依賴:
你最初使用了SpringBoot的初始化器來創(chuàng)建項目的話,在這里你選擇了一個boot的版本號。
1. ok那么恭喜你,如果說你在之后使用面板選擇的依賴的時候,那些版本號根本就不需要你去操心了,會自動適配的。就比如說我剛剛選擇了OpenFeign的依賴,我并沒有指定Cloud的版本,但是在創(chuàng)建好項目之后,查看這個pom文件就會發(fā)現(xiàn),它自動的有cloud的dependencies的依賴來進行版本的控制,如下面所示:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
這里啊,我沒有在面板中選擇有關(guān)alibaba的組件,所以啊在pom中也就沒有alibaba的dependencies了,一旦我在最開始的時候如果說選擇了的話,那么在pom中肯定也會有alibaba的dependencies的來進行版本控制的。?
總結(jié)來說:就是得了解初始化器選擇了依賴之后的一些動作
2. 如果你最開始啥都沒選,不是說真的什么都沒選,就是說你每選cloud、cloud-alibaba的組件,那么在之后的pom中也就是干干凈凈的,也就沒有相關(guān)的dependencies了。那么就比較的難受,以后你導(dǎo)的任何的一個組件,你就需要指定版本號,其實這樣就ok,沒問題。當(dāng)然咯你嘞比較懶并且你怕出錯,那你就在最開始的時候加上dependencies,來進行的版本控制。就像最開始老師文檔中給出的alibaba的denpencies一樣,他就是為了要使用alibaba的組件所以一開始就加上了。
所以總總結(jié):
其實嘞,就是兩個:1. 你直接導(dǎo)組件依賴需要指定好版本號 2. 你先導(dǎo)入組件對應(yīng)的總的dependencies,然后再導(dǎo)入組件的依賴,就可以不指定版本號了
然后就是使用boot的初始化器的話,其實它還是采取的首先加上dependencies的方案,只不過是idea可以自動的為你加上,另外如果選擇的boot的初始化器創(chuàng)建項目,即使只選擇了boot版本,后續(xù)選擇組件的時候組件的版本號可以自動適配的。
另外如果加parent報錯了,試著加上</relativePath>標(biāo)簽
一、Nacos的服務(wù)注冊/發(fā)現(xiàn)
當(dāng)然使用nacos之前得在本地機器上安裝上nacos,然后開啟服務(wù)。
如果開啟的時候出現(xiàn)了報錯,可能是安裝的路徑有中文。如果直接點擊startup命令
?那么就會出現(xiàn)啟動服務(wù)之后,打開之后,就閃退了。解決辦法是使用命令行進行單機啟動
startup.cmd -m standalone命令進行啟動
使用ip:端口/nacos就能訪問可視化界面
步驟:
1. 導(dǎo)依賴,nacos-discovery
因為服務(wù)都是需要注冊與發(fā)現(xiàn)的,所以這個依賴就寫在common公共模塊中
<!--nacos 服務(wù)注冊/發(fā)現(xiàn)-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
<version>2.2.10-RC1</version>
</dependency>
?至于為什么要排除ribbon是因為我使用feign遠(yuǎn)程調(diào)用的時候出了問題,出了下面這個報錯
java.lang.AbstractMethodError: org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.cho
另外解決這個報錯還要導(dǎo)入balance的依賴,這里只要導(dǎo)入就行了,其它不要管
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
2. 在application.yml中聲明nacos服務(wù)器的ip地址和端口號,以及指定好服務(wù)的名稱
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
application:
name: gulimall-coupon
3. 在啟動類上面加上@EnableDiscoverClient
二、Feign的遠(yuǎn)程調(diào)用
1. 導(dǎo)依賴,open-feign
這個在最初的時候在創(chuàng)建每個服務(wù)的時候就選擇了,因此就自動導(dǎo)入了
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. 寫好聲明式接口
@FeignClient("gulimall-coupon")
public interface CouponFeign {
@GetMapping("/coupon/coupon/member/coupon")
public R memberCoupon();
}
3. 在啟動類上面指定好聲明式接口的位置
?然后在controller中注入接口對象,就能直接調(diào)用了
三、Nacos的配置中心
nacos的配置中心是集中配置的,有很多方式。
大致的步驟:
1. 導(dǎo)依賴 nacos-cofig
<!-- nacos統(tǒng)一配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.10-RC1</version>
</dependency>
2. 在配置中心中按照需求進行配置,然后在application.yml文件中聲明好nacos服務(wù)器的地址和服務(wù)名稱必要時配好其它參數(shù)
其它參數(shù)可以是namespace或者是group等,具體看nacos配置中心中是怎么配的
這里我先簡單的說一下幾種配置方式:
1. 直接在nacos配置中心中配置一個和服務(wù)名同名的配置文件(也就是使用的默認(rèn)的命名空間)
比如說在nacos配置中心中聲明一個member服務(wù)的配置
配置了下面的內(nèi)容:
在類路徑下寫一個bootstrap.properties文件,這個文件的優(yōu)先級是高于application.properties文件的,所以只要配置中心中有內(nèi)容那么一定獲取到的是配置中心中的內(nèi)容。
spring.cloud.nacos.config.server-addr=localhost:8848
spring.application.name=gulimall-member
寫一個測試接口
使用@Value注解就能直接獲取到配置文件中的值
另外這里使用@RefreshScope注解來來使得更新配置文件時,也可以獲取獲取到最新值
注意這里不能動態(tài)刷新,是沒有加bootstrap依賴的緣故,加完之后記得重啟nacos:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.1.5</version>
</dependency>
2. 在nacos配置中心中直接按照環(huán)境進行劃分(使用自定義的命名空間)
其它什么依賴,還有測試都一樣,就是配置中心發(fā)生變化,并且在bootstrap.properties文件中加上相應(yīng)的配置
配置中心中,先在命名空間那里創(chuàng)建上幾個命令空間:
?然后在配置管理中在不同的命名空間中添加上配置:
然后再bootstrap.properties文件中,增添上namespace就行了
是用的什么樣的環(huán)境就配置什么命名空間,命名空間的值可以從配置中心獲取
然后就能根據(jù)不同的環(huán)境,獲取到不同環(huán)境的配置了。?
3. 按照服務(wù)進行劃分,然后再根據(jù)環(huán)境劃分(使用自定義的命名空間 + 使用分組)
就是創(chuàng)建服務(wù)名的命名空間,然后在這個空間里面創(chuàng)建不同環(huán)境的properties文件(使用組來進行區(qū)分)
然后在bootstrap.properties文件中,配好namespace和group就行了。
這就表示使用與微服務(wù)同名的命名空間中的test組下的配置文件?
4. 對一個服務(wù)可以拆解application.yml文件(其實還是第三點只不過現(xiàn)在更細(xì)了)
這個簡單,就是還是在3的基礎(chǔ)上,還是那個命名空間里,選好組,一般就同一個組,然后分別創(chuàng)建好配置文件,比如說數(shù)據(jù)源的配置文件,MyBatisPlus的配置文件,其它配置文件。就是將原來的application.yml進行拆解。
然后在bootstrap.properties中配置ext-config
spring.cloud.nacos.config.server-addr=localhost:8848
spring.application.name=gulimall-member
spring.cloud.nacos.config.namespace=e43733fe-bb9e-4369-9809-d4030a7fefef
#spring.cloud.nacos.config.group=test
spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true
spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml
spring.cloud.nacos.config.ext-config[1].group=dev
spring.cloud.nacos.config.ext-config[1].refresh=true
spring.cloud.nacos.config.ext-config[2].data-id=other.yml
spring.cloud.nacos.config.ext-config[2].group=dev
spring.cloud.nacos.config.ext-config[2].refresh=true
3. 注意點
注意:除了這種ext配置,其它在配置中心中的配置文件都是和服務(wù)名同名的配置文件,這是規(guī)則,只有這樣,才能找到配置文件,因為你其實在bootstrap.properties文件中是沒有直接配置文件名的,而只是配置了一個命名空間,那到底是怎樣找到命名空間中的配置文件的,就是使用服務(wù)名去找的,因為bootstrap中配置了服務(wù)名,因此可以映射到配置文件。
還有就是第三種方式和第四種是在開發(fā)中常用的,可以看作是最佳實踐。
四、GeteWay網(wǎng)關(guān)
對于網(wǎng)關(guān)的話,有很多功能,鑒權(quán)、限流、路由都能干。網(wǎng)關(guān)其實就是進入微服務(wù)前的一道大門。
路由應(yīng)該是網(wǎng)關(guān)的比較重要的功能了,我也只學(xué)了路由。
下面我就說一下路由:
路由其實就是找方向,把它引導(dǎo)到哪里去的功能,就是起到一個引導(dǎo)的作用。
路由的話大致就是一個路由的地址,還有斷言規(guī)則以及過濾器大致就可以描述了。
路由地址就是最終去到的目標(biāo)地址
斷言規(guī)則就是如何去到目標(biāo)地址,符合一定的規(guī)則才能去到對于的目標(biāo)地址。
過濾器就是到達目標(biāo)路徑的時候,可以對請求進行過濾,也就是可以往請求中添加一些東西或者啥的,以及響應(yīng)回來也可以過濾一遍。
就比如說下面這個例子:
當(dāng)一個網(wǎng)址的url名稱的參數(shù),參數(shù)值為baidu時,就跳到百度網(wǎng)站
當(dāng)參數(shù)值為jd時間,就跳到京東網(wǎng)站。
這個斷言的規(guī)則是需要翻閱文檔的,這個例子的斷言規(guī)則就是
- Query=參數(shù)名,參數(shù)值
于是路由就這樣配:
routes:
- id: baidu_route
uri: https://www.baidu.com
predicates:
- Query=url,baidu
- id: jd_route
uri: https://www.jd.com
predicates:
- Query=url,jd
?然后這個網(wǎng)關(guān)本身也是一個服務(wù),所以也得注冊到注冊中心去。這樣才能服務(wù)發(fā)現(xiàn)其它服務(wù),另外通過注冊中心可以查看到其它服務(wù)的健康狀態(tài),以及進行根據(jù)注冊中心對各服務(wù)信息的獲取實現(xiàn)負(fù)載均衡,所以說網(wǎng)關(guān)的很多功能其實基于注冊中心的,所以得把網(wǎng)關(guān)注冊進去。
注冊到注冊中心和其它服務(wù)注冊到注冊中心一樣就那三步。下面是完整的yml配置:
spring:
cloud:
nacos:
server-addr: localhost:8848
gateway:
routes:
- id: baidu_route
uri: https://www.baidu.com
predicates:
- Query=url,baidu
- id: jd_route
uri: https://www.jd.com
predicates:
- Query=url,jd
application:
name: geteway
三、完成的進度
注冊中心、遠(yuǎn)程調(diào)用、配置中心、網(wǎng)關(guān)的簡單例子都在電腦上面測了一遍。文章來源:http://www.zghlxwxcb.cn/news/detail-491386.html
四、總結(jié)
主要是具體幾種微服務(wù)的組件的實操,知道具體怎樣使用。通過實操加深微服務(wù)的理解。文章來源地址http://www.zghlxwxcb.cn/news/detail-491386.html
到了這里,關(guān)于谷粒商城第三天-微服務(wù)中基本組件的使用 java.lang.AbstractMethodError: org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.cho的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!