一、服務的提供者與服務的消費者
二、服務發現原理
如果用戶中心地址發生變化怎么辦?
服務的消費者總能找到服務的提供者的這種原理,即服務發現原理。
三、什么是Nacos?
Nacos文檔地址請查看,引入Nacos,架構的演進
四、搭建Nacos Server
1、下載Nacos 下載地址
在spring-cloud-alibaba-dependencies下按住Ctrl+鼠標左鍵,查看Nacos組件相關的版本。
<nacos.client.version>1.0.0</nacos.client.version>
<nacos.config.version>0.8.0</nacos.config.version>
nacos-server-1.0.1是兼容nacos-server-1.0.0的,所以我這里選用nacos-server-1.0.1版本。
2、搭建Nacos Server
Nacos 快速開始
五、將應用注冊到Nacos
1、將user-content注冊到Nacos
pom.xml添加
<!--spring-cloud-starter-{spring cloud子項目名稱}-[{模塊名稱}]-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
application.yml添加
spring:
cloud:
nacos:
discovery:
#指定nacos server的地址
server-addr: localhost:8848
application:
# 服務名稱盡量用-,不用要_,更不要用特殊字符
name: user-center
啟動服務
在此之前,你應該先啟動nacos-server
登錄查看注冊的服務
2、將content-center注冊到Nacos
按照user-center將content-center注冊到Nacos
在此刷新頁面,我們可以看到
3、在content-center下編寫測試代碼
在TestController下添加如下代碼
@Autowired
private DiscoveryClient discoveryClient;
/**
* 測試:服務發現,證明內容中心可以查找到用戶中心
* @return 用戶中心所有地址的詳細信息
*/
@GetMapping("/test2")
public List<ServiceInstance> getInstances(){
// 查詢指定服務所有實例的信息
return this.discoveryClient.getInstances("user-center");
}
在瀏覽器下進行測試
開啟用戶中心多個實例進行測試
思考?如果將用戶中心斷開,再次刷新瀏覽器觀察變化
六、為內容中心引入服務發現
修改ShareService
@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ShareService {
private final ShareMapper shareMapper;
private final RestTemplate restTemplate;
private final DiscoveryClient discoveryClient;
public ShareDTO findById(Integer id){
// 獲取分享的詳情
Share share = this.shareMapper.selectByPrimaryKey(id);
// 發布人id
Integer userId = share.getUserId();
// 獲取用戶中心所有實例信息
List<ServiceInstance> instances = discoveryClient.getInstances("user-center");
String targetURL = instances.stream()
// 數據變換
.map(instance-> instance.getUri().toString() + "/users/{id}")
.findFirst()
.orElseThrow(()-> new IllegalArgumentException("當前沒有實例"));
log.info("請求的目標地址:{}",targetURL);
// 怎么調用用戶微服務的users/{userId}
UserDTO userDTO = this.restTemplate.getForObject(
targetURL,
UserDTO.class,
userId
);
// 消息的裝配
ShareDTO shareDTO = new ShareDTO();
BeanUtils.copyProperties(share,shareDTO);
shareDTO.setWxNickname(userDTO.getWxNickname());
return shareDTO;
}
}
測試
七、Nacos服務發現的領域模型
- Namespace:實現隔離,默認public
- Group:不同服務可以分到一個組,默認DEFAULT_GROUP
- Service:微服務
- Cluster:對指定微服務的一個虛擬划分,默認DEFAULT
- Instance:微服務實例
八、Nacos元數據
官方文檔說明
元數據的作用
- 提供描述信息
- 讓微服務調用更加靈活
如何為微服務設置元數據?
- 控制台方式指定
- 配置文件指定