微服務架構
正常的小項目就是所有的功能集成在一個模塊中,這樣代碼之間不僅非常耦合,而且修改處理的時候也非常的麻煩,應對高并發時也不好處理,所以 我們可以使用微服務架構,對項目進行模塊之間的拆分,每一個微服務負責一部分的業務功能,處理也比較方便。
springcolud 集成了微服務的很多組件,可以達到我們對微服務的使用
微服務拆分原則
我們對項目拆分是有原則的,比如一個小項目,我們前期可以先寫出來,然后后期慢慢拆分,但是如果是大項目剛開始就設計好了微服務,那么我們就可以在項目開始進行微服務的拆分
微服務拆分的時候各個模塊需要 高內聚,低耦合??
拆分方法
拆分的時候 可以 使用完全解耦的拆分,就是每個微服務項目都是一個獨立的工程,項目完全解耦,但是管理比較麻煩
還可以使用maven聚合的拆分,維護方便,但是服務之間耦合,編譯比較耗時
maven聚合形式如何拆分? 就是把不同功能模塊的代碼抽取到一個新模塊中去 例如如下情況
服務之間調用
假如說 我們現在有一個購物車接口,訪問路徑是 /cart/search ,那么我們微服務之間進行調用,就可以 在調用方配置resttemplate 配置,然后進行遠程調用
具體代碼實現如下
package com.hmall.cart.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class RemoteCallConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}
private void handleCartItems(List<CartVO> vos) {// TODO 1.獲取商品idSet<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());// 2.查詢商品// List<ItemDTO> items = itemService.queryItemByIds(itemIds);// 2.1.利用RestTemplate發起http請求,得到http的響應ResponseEntity<List<ItemDTO>> response = restTemplate.exchange("http://localhost:8081/items?ids={ids}",HttpMethod.GET,null,new ParameterizedTypeReference<List<ItemDTO>>() {},Map.of("ids", CollUtil.join(itemIds, ",")));// 2.2.解析響應if(!response.getStatusCode().is2xxSuccessful()){// 查詢失敗,直接結束return;}List<ItemDTO> items = response.getBody();if (CollUtils.isEmpty(items)) {return;}// 3.轉為 id 到 item的mapMap<Long, ItemDTO> itemMap = items.stream().collect(Collectors.toMap(ItemDTO::getId, Function.identity()));// 4.寫入vofor (CartVO v : vos) {ItemDTO item = itemMap.get(v.getItemId());if (item == null) {continue;}v.setNewPrice(item.getPrice());v.setStatus(item.getStatus());v.setStock(item.getStock());}
}
但是你每次這樣調用 都要寫一遍,這是不是顯的太過冗余,太過麻煩,所以我們引用了接下來的組件 nacos
nacos
nacos是alibaba的一個組件,具體的下載配置流程就不再贅述,
下面我們進行一個場景的分析,現在有一個購物車服務 cartservice ,然后還有一個商品服務 itemservice,我們是查看購物車的時候需要訪問商品服務,當我們的用戶一多,并發量上來的時候商品服務這個 模塊有可能就會承受不住崩潰,所以我們可以多開幾個啟動實例,進行負載均衡的配置,可是當我們訪問的這幾個不同的實例的時候,我們該怎么訪問這些實例呢?
于是就有了nacos
nacos注冊中心原理
當我們配置好nacos之后,我們的實例的端口號 就會發送給nacos注冊中心 ,當我們服務的調用者進行調用的時候,具體的服務端口號就從nacos中進行拉取。但是當我們注冊到幾個實例到nacos中,假如有一些實例變更了,上傳錯誤怎么辦,nacos會有一個心跳檢測,服務會定期像nacos中發送自己狀態也就是心跳請求證明自己健康,當nacos長時間收不到服務提供者的心跳的時候,會認為該實例宕機,從實例列表中剔除,而服務列表變更,nacos主動通知服務調用著,更新本地服務列表
nacos使用
我們下載好nacos之后,在數據庫配置好nacos的對應數據表,在nacos的custom.env文件中配置好自己ip地址,然后訪問
http://xxxxxx:8848/nacos/? 這個xxx如果是虛擬機填虛擬機的ip如果是本機就填本機ip就可以。
然后就會有如下頁面
然后我們在商品服務 itemservice中引入pom依賴
<!--nacos 服務注冊發現-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
在商品服務的yml文件中配置
spring:application:name: item-service # 服務名稱cloud:nacos:server-addr:xxxxx:8848 # nacos地址
xxxx為IP地址,
然后我們拷貝多個實例
點擊復制,然后?
配置好不同的端口,啟動實例,就可以在nacos中看到服務上傳的實例
服務發現
而我們想調用上傳的服務,也就是說購物車服務調用商品服務上傳的實例
我們需要在購物車服務配置服務發現在購物車服務中yml文件中添加
spring:cloud:nacos:server-addr: xxx:8848
引入依賴
<!--nacos 服務注冊發現-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
這個配置好,也就是說購物車服務也會被注冊為nacos服務,既可以被調用,也可以被調用
我們在service注冊該bean ,然后使用如下方法調用