1.【Spring Cloud Alibaba】服務發現-Nacos


一、服務的提供者與服務的消費者

image

二、服務發現原理

如果用戶中心地址發生變化怎么辦?
服務的消費者總能找到服務的提供者的這種原理,即服務發現原理。

image

三、什么是Nacos?

Nacos文檔地址請查看,引入Nacos,架構的演進

image

四、搭建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

image

登錄查看注冊的服務

image

2、將content-center注冊到Nacos

按照user-center將content-center注冊到Nacos

在此刷新頁面,我們可以看到

image

3、在content-center下編寫測試代碼

在TestController下添加如下代碼

@Autowired
private DiscoveryClient discoveryClient;
 /**
 * 測試:服務發現,證明內容中心可以查找到用戶中心
 * @return 用戶中心所有地址的詳細信息
 */
@GetMapping("/test2")
public List<ServiceInstance> getInstances(){
    // 查詢指定服務所有實例的信息
    return this.discoveryClient.getInstances("user-center");
}

在瀏覽器下進行測試

image

開啟用戶中心多個實例進行測試

image

image

思考?如果將用戶中心斷開,再次刷新瀏覽器觀察變化

六、為內容中心引入服務發現

修改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;
    }
}
測試

image

七、Nacos服務發現的領域模型

image

  • Namespace:實現隔離,默認public
  • Group:不同服務可以分到一個組,默認DEFAULT_GROUP
  • Service:微服務
  • Cluster:對指定微服務的一個虛擬划分,默認DEFAULT
  • Instance:微服務實例

image

image

八、Nacos元數據

官方文檔說明

image

元數據的作用
  • 提供描述信息
  • 讓微服務調用更加靈活
如何為微服務設置元數據?
  • 控制台方式指定
  • 配置文件指定

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM