學習條件
- 瞭解web三層架構
- 熟練應用SSM架構
- 瞭解Maven管理工具的使用
- 熟練使用SpringBoot,以及瞭解SpringBoot基本原理。
- 瞭解部分術語:應用、工具、耦合、負載等
溫馨提示:注意版本問題,不復雜,就是呀呀的版本選不好,Game Over.....
沒有從入門開始寫,這點應該能入門,裝x用的文章,首次編寫,有疑問留言(看到也不想回你),沒疑問,謝謝惠顧!喜歡就點個贊!!!
什麼是微服務?談談個人理解....
引文:單體架構是微服務架構出現之前,最經典的軟體架構型別,許多早期的專案採用的也都是單體架構。單體架構將應用程式中所有業務邏輯都編寫在同一個工程中,最終經過編譯、打包,部署在一臺伺服器上執行。
微:體積小,簡單
服務:功能實現。
微服務 = 體量小,複雜程度低的功能實現模組
微服務架構:微服務是一種全新的系統架構設計風格,每個服務只專注於做好一件事(三十六行,行行出狀元)“專業的人做專業的事”。簡單來說:就是把單體服務,拆了再拆,構建成體量小的模組,每個模組構成一個服務,多個服務的集合就是微服務架構。SpringCloud的誕生,就是來管理這些微小服務之間溝通的(不止於SpringCloud、Dubbo等)。
面試題:見附錄
SpringCloud
引文:“工具”指一些列功能的集合體,泛指工作時所需用的器具。
Spring Cloud 被稱為構建分散式微服務系統的“全家桶”,它並不是某一門技術,而是一系列微服務解決方案或框架的有序集合。更有效的實現開發應用管理的“工具”。
Spring Cloud 將市面上成熟的、經過驗證的微服務框架整合起來,並通過 Spring Boot 的思想進行再封裝,遮蔽調其中複雜的配置和實現原理,最終為開發人員提供了一套簡單易懂、易部署和易維護的分散式系統開發工具包。
SpringCloud整合核心功能官網
- Distributed/versioned configuration 分散式/版本化的配置管理
- Service registration and discovery 服務註冊與服務發現
- Routing 路由
- Service-to-service calls 端到端的呼叫
- Load balancing 負載均衡
- Circuit Breakers 斷路器
- Global locks 全域性鎖
- Leadership election and cluster state 選舉與叢集狀態管理
- Distributed messaging 分散式訊息
SpringCloud與SprigBoot版本關係見附錄(官網)
Spring Cloud 本身並不是一個拿來即可用的框架,它是一套微服務規範,這套規範共有兩代實現。重要轉折點
- 第一代實現: Spring Cloud Netflix,
- 第二代實現: Spring Cloud Alibaba
2018 年 12 月12 日,Netflix 公司宣佈 Spring Cloud Netflix 系列大部分元件都進入維護模式,不再新增新特性。這嚴重地限制了 Spring Cloud 的高速發展,於是各大網際網路公司和組織開始把目光轉向 Spring Cloud 的第二代實現:Spring Cloud Alibaba。
Spring Cloud Alibaba 元件
Spring Cloud Alibaba 包含了多種開發分散式微服務系統的必需元件
- Nacos:阿里巴巴開源產品,一個更易於構建雲原生應用的動態服務發現,配置管理和服務管理平臺。
- Sentinel:阿里巴巴開源產品,把流量作為切入點,從流量控制,熔斷降級,系統負載保護等多個維度保護服務的穩定性。
- RocketMQ:Apache RocketMQ 是一款基於Java 的高效能、高吞吐量的分散式訊息和流計算平臺。
- Dubbo:Apache Dubbo 是一款高效能的 Java RPC 框架。
- Seata:阿里巴巴開源產品,一個易於使用的高效能微服務分散式事務解決方案。
- Alibaba Cloud OSS:阿里雲物件儲存伺服器(Object Storage Service,簡稱OSS),是阿里雲提供的海量、安全、低成本、高可靠的雲端儲存服務。
- Alibaba Cloud Schedulerx:阿里中介軟體團隊開發的一款分散式排程產品,支援週期性的任務與固定時間點觸發任務。
【學習內容】
Nacos 即 Dynamic Naming and Configuration Service(動態命名與配置服務)。由 Naming 前兩個字母,Configuration 前兩個字母,以及 Service 首字母組成。
Nacos 是一個更易於構建雲原生應用的動態服務發現、配置管理 以及 服務管理平臺。
簡單的理解:
Nacos 就是 註冊中心 + 配置中心。即 Nacos = Eureka + Config + Bus。
學習條件:
為什麼要學習註冊中心?
微服務架構,就是很多小服務的集合體,對多個服務進行單獨管理是比較麻煩。服務之間呼叫,A呼叫B,如果B因特殊需要(比如他很開心),想要頻繁更換埠或IP地址,那麼A服務中的程式碼怎麼辦?跟著重複更新....維護比較麻煩。註冊中心可以解決這一問題。
註冊中心能幹什麼?
服務註冊,服務發現是什麼東東?怎麼理解?
簡單理解,服務提供方把自己的服務名+埠告訴了註冊中心,註冊中心,統一定義,統一管理。這一過程就是服務註冊。反之服務發現,自己能理解吧!不能就百度...
主要功能
-
服務發現和服務健康監測
-
動態配置服務
-
動態DNS服務
-
服務及其後設資料管理
【專案簡介】
1. 新建Maven父工程springcloud-alibaba-parent
2. 新建子模組nacos-provider-8000
- 提供Ctroller、Service、Mapper(略,暫定使用集合資料充當DB)
- 提供對外介面,http://ip+埠/URI/entityInfo
3. 新建子模組nacos-consumer_9000
- 提供Ctroller,實現遠端呼叫nacos-provider-8000工程對外提供資料介面
實現遠端呼叫,需要了解Http協議,請求頭,請求行,請求體,資料傳輸方式等(WEB階段Tomcat、Servlet學習)。
遠端呼叫方式繁多(更多遠端操作方式見附錄)
為什麼要學習並使用遠端調?演示遠端呼叫
例如:開發一款名為:智尚專屬的APP,需求定時傳送你的定位...那麼定位系統如何實現?不清楚,但是百度、高德可支援(軟體+硬體),此時我們就需要通過遠端呼叫的方式,呼叫第三方系統暴露的介面實現
新建父工程
- 建立Maven父工程:springcloud-nacose(不使用快捷建立-看個人習慣)
- 父工程:pom依賴如下
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>org.example</groupId> 8 <artifactId>spingcloud-nacos</artifactId> 9 <packaging>pom</packaging> 10 <version>1.0-SNAPSHOT</version> 11 <!-- 引入子模組,子模組新建後IDEA預設自動構建 --> 12 <modules> 13 <module>nacos-provider-8000</module> 14 </modules> 15 16 <!-- 版本管理 --> 17 <properties> 18 <maven.compiler.source>8</maven.compiler.source> 19 <maven.compiler.target>8</maven.compiler.target> 20 <springbootstart.version>2.4.2</springbootstart.version> 21 </properties> 22 <!-- 依賴管理,僅管理,非匯入,子模組:按需手動匯入相關依賴,可以省略版本version --> 23 <dependencyManagement> 24 <!-- springboot 提供了N個start依賴 ,spring-boot-dependencies可以幫我們統一依賴 --> 25 <dependencies> 26 <dependency> 27 <groupId>org.springframework.boot</groupId> 28 <artifactId>spring-boot-dependencies</artifactId> 29 <version>${springbootstart.version}</version> 30 <type>pom</type> 31 <scope>import</scope> 32 </dependency> 33 <!-- lombok元件-簡化POJO開發 --> 34 <dependency> 35 <groupId>org.projectlombok</groupId> 36 <artifactId>lombok</artifactId> 37 <version>1.18.22</version> 38 </dependency> 39 </dependencies> 40 </dependencyManagement> 41 </project>
新建子模組nacos-provider-8000
- 建立子模組:nacos-provider-8000
- nacos-provider-8000子模組:pom依賴如下
1 <properties> 2 <maven.compiler.source>8</maven.compiler.source> 3 <maven.compiler.target>8</maven.compiler.target> 4 </properties> 5 <dependencies> 6 <!-- web依賴,用以可用Sring/MVC相關注解 --> 7 <dependency> 8 <groupId>org.springframework.boot</groupId> 9 <artifactId>spring-boot-starter-web</artifactId> 10 </dependency> 11 <!-- lombok元件模組-便於開發POJO --> 12 <dependency> 13 <groupId>org.projectlombok</groupId> 14 <artifactId>lombok</artifactId> 15 </dependency> 16 </dependencies>
注意事項:
- 父工程pom中需使用<modules>標籤指向子模組(IDEA預設新建子模組時自動構建)
- 子模組需使用<parent>標籤引入父工程
- src/main/java下新建包:com.nacosprovider
- com.nacosprovider下新建SpringBoot啟動類:NacosProviderApp
1 @SpringBootApplication 2 public class NacosProviderApp { 3 public static void main(String[] args) { 4 SpringApplication.run(NacosProviderApp.class); 5 } 6 }
- src/main/resources下新建配置檔案:application.properties ,並設定服務埠
1 #當前模nacos-provider-8000塊服務埠 2 server.port=8000 3 #當前服務應用上下文路徑:專案路徑 4 #server.servlet.context-path=/provider
- com.nacosprovider下新建包:entity,並新增實體類EntityInfo
1 @Data 2 public class EntityInfo { 3 private String entityId; 4 private String entityInfo; 5 private String sendTime; 6 }
- com.nacosprovider下新建包:service,並新增EntityInfoService
1 @Service 2 public class EntityInfoService { 3 public EntityInfo queryEntityInfo(String entityId){ 4 EntityInfo entityInfo = new EntityInfo(); 5 entityInfo.setEntityId(entityId); 6 // return mapper.queryEntityInfo(entityInfo); 7 entityInfo.setSendTime("xxxx年xx月xx日 HH:mm:ss"); 8 entityInfo.setEntityInfo("Hello Nacos!"); 9 return entityInfo; 10 } 11 }
- com.nacosprovider下新建包:controller,並新增NacosProviderController
1 @RestController 2 @RequestMapping("/provider") 3 public class NacosProviderController { 4 5 @Autowired 6 private EntityInfoService entityInfoService; 7 8 @GetMapping("/entityInfo/{entityId}") 9 public EntityInfo queryEntityInfo(@PathVariable("entityId") String entityId){ 10 return entityInfoService.queryEntityInfo(entityId); 11 } 12 13 }
- 啟動服務測試訪問/postman測試均可:http://localhost:8000/provider/entityInfo/11
實際開發中:服務提供這將編寫介面文件(API文件),說明介面呼叫規則,入參,返參等。
新建子模組:nacos-consumer-9000
- 新建子模組過程、配置檔案、啟動類、pom依賴(可移除lombok元件)略
-
新建包com.nacoseconsumer.config,類BeanManagerConfig
1 @Component 2 class BeanManagerConfig { 3 /** 4 * Spring框架提供的RestTemplate類可用於在應用中呼叫rest服務 5 */ 6 @Bean 7 public RestTemplate getRestTemplate(){ 8 return new RestTemplate(); 9 } 10 }
- 新建包com.nacoseconsumer.controller,類NacosConsumerController
1 @RestController 2 @RequestMapping("/consumer") 3 public class NacosConsumerController { 4 /** 5 * Spring框架提供的RestTemplate類可用於在應用中呼叫rest服務 6 */ 7 @Autowired 8 private RestTemplate restTemplate; 9 /** 10 * @Description 請求第三方遠端介面 11 * @param 12 * @return 13 */ 14 @GetMapping("/entityInfo/{entityId}") 15 public String queryEntityInfo(@PathVariable("entityId") String entityId){ 16 String url = "http://localhost:8000/provider/entityInfo/"+entityId; 17 ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class); 18 return forEntity.getBody(); 19 } 20 }
- 啟動服務測試/posman訪問:http://localhost:9000/consumer/entityInfo/11
遺留問題(缺點)
- 手動的維護所有的服務訪問ip地址列表。
- 單個服務實現負載均衡需要自己搭建(keepalive+Ngix)
使用註冊中心能夠實現服務治理,服務動態擴容,以及服務呼叫的負載均衡。
Nacos入門實戰
- Nacos 官網(下載、文件、安裝、啟停服務*附錄)
- 父工程新增依賴
1 <!-- SpringCloud依賴 --> 2 <dependency> 3 <groupId>org.springframework.cloud</groupId> 4 <artifactId>spring-cloud-dependencies</artifactId> 5 <version>2020.0.1</version> 6 <type>pom</type> 7 <scope>import</scope> 8 </dependency> 9 <!-- SpringCloudAlibaba依賴 --> 10 <dependency> 11 <groupId>com.alibaba.cloud</groupId> 12 <artifactId>spring-cloud-alibaba-dependencies</artifactId> 13 <version>2021.1</version> 14 <type>pom</type> 15 <scope>import</scope> 16 </dependency>
- nacos-provider-8000 新增pom依賴
1 <!-- 基於SpringCloud alibaba提供的針對Nacos的元件:服務註冊與發現 --> 2 <dependency> 3 <groupId>com.alibaba.cloud</groupId> 4 <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> 5 </dependency>
- nacos-consumer-9000 新增pom依賴
<!-- 基於SpringCloud alibaba提供的針對Nacos的元件:服務註冊與發現 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- 負載均衡依賴 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
說明:Spring Cloud LoadBalancer是一個客戶端負載均衡器,類似於Ribbon,但是由於Ribbon已經進入維護模式,並且Ribbon 2並不與Ribbon 1相互相容,所以Spring Cloud全家桶在Spring Cloud Commons專案中,新增了Spring cloud Loadbalancer作為新的負載均衡器,並且做了向前相容。
Nacos內部已經整合Ribbon(負載均衡器),所以RestTemplate與Nacos整合使用時,管理RestTemplate的bean推薦使用LoadBalancer。
- 優化RestTmplate的bean管理,新增註解
1 @Bean 2 @LoadBalanced 3 public RestTemplate getRestTemplate(){ 4 return new RestTemplate(); 5 }
- 更改Cotroll,使用服務名稱實現遠端呼叫(通過註冊中的服務名稱實現呼叫,擯棄維護IP、埠)
1 @GetMapping("/entityInfo/{entityId}") 2 public String queryEntityInfo(@PathVariable("entityId") String entityId) { 3 String url = "http://nacos-provider/provider/entityInfo/" + entityId; 4 System.out.println(url); 5 ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class); 6 return forEntity.getBody(); 7 }
說明:不使用註解,不使用LoadBalancer,直接改URL的IP為服務提供者的服務名稱呼叫會報錯java.net.UnknownHostException: nacos-provider
原因:Nacos內部已經整合Ribbon(負載均衡器),RestTemplate與Nacos整合使用時,需要開啟負載均衡,因此管理RestTemplate的bean必須使用註解@LoadBalanced,表示開啟負載均衡。否則無法直接通過“服務提供者的服務名”訪問。
2.必須使用IP訪問腫麼辦?
可以注入LoadBalancerClient,根據服務名稱獲取ServiceInstance,再獲取IP+PORT即可,此時維護RestTemplate是就無需使用@LoadBalanced。
可以注入DiscoveryClient (服務發現工具類),根據服務名獲取列表List<ServiceInstance>(通常服務名唯一,所以列表如果不為null長度也是1).
1 @RestController 2 @RequestMapping("/consumer") 3 public class NacosConsumerController { 4 /** 5 * Spring框架提供的RestTemplate類可用於在應用中呼叫rest服務 6 */ 7 @Autowired 8 private RestTemplate restTemplate; 9 /** 10 * 負載均衡客戶端 11 */ 12 @Autowired 13 private LoadBalancerClient loadBalancerClient; 14 /** 15 * 服務發現客戶端 16 */ 17 @Autowired 18 private DiscoveryClient discoveryClient; 19 20 /** 21 * @param 22 * @return 23 * @Description 請求第三方遠端介面 24 */ 25 @GetMapping("/entityInfo/{entityId}") 26 public String queryEntityInfo(@PathVariable("entityId") String entityId) { 27 String url = "http://nacos-provider/provider/entityInfo/" + entityId; 28 29 // 使用以下方式,則需要幹掉restTemplate負載均衡註解,開啟負載均衡,Ncose中就只能通過服務名呼叫服務了 30 // 負載均衡發現服務 31 ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider"); 32 String uri = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort(); 33 url = uri + "/provider/entityInfo/" + entityId; 34 // 註冊與發現,發現服務客戶端獲取服務 35 List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("nacos-provider"); 36 serviceInstanceList.get(0).getPort(); 37 serviceInstanceList.get(0).getHost(); 38 serviceInstanceList.get(0).getUri(); 39 40 System.out.println(serviceInstanceList.get(0).getUri()); 41 ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class); 42 return forEntity.getBody(); 43 } 44 }
附錄
Nacos
- 下載
登入Nacos官網,登入GitHub,也可以直接進入GitHub搜尋“Nacos”
2. 安裝
理論上直接解壓即可,只要下對了寶寶!
3.啟停
啟停分為單機版(入門常規)、叢集版(高可用)
windows命令:
1 startup.cmd -m standalone
命令說明:startup.cmd 啟動程式,雙擊或DOS命令均可(雙擊啟動請繼續看完)
引數說明:-m 模式模型,standalone 標識-單機模式啟動
雙擊啟動檔案啟動(需手動修改啟動檔案)
1 原:cluster標識叢集模式 2 set MODE="cluster" 3 修改為:standalone標識單機模式 4 set MODE="standalone"
4.基本配置
單體架構VS微服務
不同點 | 微服務架構 | 單體架構 |
---|---|---|
團隊規模 | 微服務架構可以將傳統模式下的單個應用,拆分為多個獨立的服務,每個微服務都可以單獨開發、部署和維護。每個服務從設計、開發到維護所需的團隊規模小,團隊管理成本小。 | 單體架構的應用程式通常需要一個大型團隊,圍繞一個龐大的應用程式工作,團隊管理的成本大。 |
資料儲存方式 | 不同的微服務可以使用不同的資料儲存方式,例如有的用 Redis,有的使用 MySQL。 | 單一架構的所有模組共享同一個公共資料庫,儲存方式相對單一。 |
部署方式 | 微服務架構中每個服務都可以獨立部署,也可以獨立於其他服務進行擴充套件。如果部署得當,基於微服務的架構可以幫助企業提高應用程式的部署效率。 | 採用單體架構的應用程式的每一次功能更改或 bug 修復都必須對整個應用程式重新進行部署。 |
開發模式 | 在採用微服務架構的應用程式中,不同模組可以使用不同的技術或語言進行開發,開發模式更加靈活。 | 在採用單體架構的應用程式中,所有模組使用的技術和語言必須相同,開發模式受限。 |
故障隔離 | 在微服務架構中,故障被隔離在單個服務中,避免系統的整體崩潰。 | 在單體架構中,當一個元件出現故障時,故障很可能會在程式中蔓延,導致系統全域性不可用。 |
專案結構 | 微服務架構將單個應用程式拆分為多個獨立的小型服務,每個服務都可以獨立的開發、部署和維護,每個服務都能完成一項特定的業務需求。 | 單體架構的應用程式,所有的業務邏輯都集中在同一個工程中。 |
SpringCloud與SprigBoot版本關係
2021.0.x aka Jubilee |
2.6.x |
2020.0.x aka Ilford |
2.4.x, 2.5.x (Starting with 2020.0.3) |
2.2.x, 2.3.x (Starting with SR5) |
|
2.1.x |
|
2.0.x |
|
1.5.x |
|
1.5.x |
SpringCloud 對比 Dubbo
功能 | Dubbo | SpringCloud |
---|---|---|
服務註冊中心 | Zookeeper | Eureka(主流)、Consul、zookeeper |
服務呼叫方式 | RPC基於Dubbo協議 | REST API 基於Http協議 |
服務監控 | Dubbo-Monitor | Spring Boot Admin |
熔斷器 | 不完善 | Spring Cloud Netflix Hystrix |
服務閘道器 | 無 | Spring Cloud Netflix Zuul、Gateway |
分散式配置 | 無 | Spring Cloud Config |
服務跟蹤 | 無 | Spring Cloud Sleuth+Zipkin(一般) |
資料流 | 無 | Spring Cloud Stream |
批量任務 | 無 | Spring Cloud Task |
資訊匯流排 | 無 | Spring Cloud Bus |