日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

闪聚支付-第1章-Nacos-服务发现与配置管理

發(fā)布時(shí)間:2024/1/18 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 闪聚支付-第1章-Nacos-服务发现与配置管理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

學(xué)習(xí)目標(biāo)

  • 能夠理解微服務(wù)架構(gòu)的特點(diǎn)
  • 能夠理解服務(wù)發(fā)現(xiàn)的流程
  • 能夠說出Nacos的功能
  • 掌握Nacos的安裝方法
  • 掌握RESTful服務(wù)發(fā)現(xiàn)開發(fā)方法
  • 掌握Dubbo服務(wù)發(fā)現(xiàn)開發(fā)方法
  • 理解Nacos服務(wù)發(fā)現(xiàn)的數(shù)據(jù)模型
  • 能夠掌握Nacos配置管理方法
  • 掌握Nacos擴(kuò)展配置方法

理解服務(wù)發(fā)現(xiàn)

微服務(wù)架構(gòu)

為適應(yīng)企業(yè)的業(yè)務(wù)發(fā)展,提高軟件研發(fā)的生產(chǎn)力,降低軟件研發(fā)的成本,軟件架構(gòu)也作了升級(jí)和優(yōu)化,將一個(gè)獨(dú)立的系統(tǒng)拆分成若干小的服務(wù),每個(gè)小服務(wù)運(yùn)行在不同的進(jìn)程中,服務(wù)與服務(wù)之間采用RESTful、RPC等協(xié)議傳輸數(shù)據(jù),每個(gè)服務(wù)所擁有的功能具有獨(dú)立性強(qiáng)的特點(diǎn),這樣的設(shè)計(jì)就實(shí)現(xiàn)了單個(gè)服務(wù)的高內(nèi)聚,服務(wù)與服務(wù)之間的低耦合效果,這些小服務(wù)就是微服務(wù),基于這種方法設(shè)計(jì)的系統(tǒng)架構(gòu)即微服務(wù)架構(gòu)。

下圖是基于微服務(wù)架構(gòu)的電商系統(tǒng):

特點(diǎn)
  • 服務(wù)層按業(yè)務(wù)拆分為一個(gè)一個(gè)的微服務(wù)。
  • 微服務(wù)的職責(zé)單一。
  • 微服務(wù)之間采用RESTful、RPC等輕量級(jí)協(xié)議傳輸。
  • 有利于采用前后端分離架構(gòu)。
  • 理解服務(wù)發(fā)現(xiàn)

    測(cè)試環(huán)境

    在微服務(wù)架構(gòu)中,整個(gè)系統(tǒng)會(huì)按職責(zé)能力劃分為多個(gè)服務(wù),通過服務(wù)之間協(xié)作來實(shí)現(xiàn)業(yè)務(wù)目標(biāo)。這樣在我們的代碼中免不了要進(jìn)行服務(wù)間的遠(yuǎn)程調(diào)用,服務(wù)的消費(fèi)方要調(diào)用服務(wù)的生產(chǎn)方,為了完成一次請(qǐng)求,消費(fèi)方需要知道服務(wù)生產(chǎn)方的網(wǎng)絡(luò)位置(IP地址和端口號(hào))。

    我們的代碼可以通過讀取配置文件的方式讀取服務(wù)生產(chǎn)方網(wǎng)絡(luò)位置,如下:

    我們通過Spring boot技術(shù)很容易實(shí)現(xiàn):

    1、創(chuàng)建nacos-discovery父工程

    pom.xml如下:

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itheima.nacos</groupId><artifactId>nacos-discovery</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.1.3.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement> </project>
    2、Service B(服務(wù)生產(chǎn)者)

    創(chuàng)建服務(wù)提供者 nacos-restful-provider。

    pom.xml如下:

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>nacos-discovery</artifactId><groupId>com.itheima.nacos</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><groupId>com.itheima.nacos</groupId><artifactId>nacos-restful-provider</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies></project>

    Service B是服務(wù)的生產(chǎn)方,暴露/service服務(wù)地址,實(shí)現(xiàn)代碼如下:

    1、創(chuàng)建Controller

    package com.itheima.nacos.provider.controller;import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;@RestController public class RestProviderController {//暴露RESTful接口@GetMapping(value = "/service")public String service() {System.out.println("provider invoke");return "provider invoke";} }

    2、創(chuàng)建啟動(dòng)類

    package com.itheima.nacos.provider;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication public class SpringRestProviderBootstrap {public static void main(String[] args) {SpringApplication.run(SpringRestProviderBootstrap.class, args);} }

    3、配置文件

    創(chuàng)建application.yml,內(nèi)容如下:

    server:port: 56010
    3、Service A(服務(wù)消費(fèi)者)

    創(chuàng)建nacos-restful-consumer 服務(wù)消費(fèi)工程。

    pom.xml如下:

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>nacos-discovery</artifactId><groupId>com.itheima.nacos</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><groupId>com.itheima.nacos</groupId><artifactId>nacos-restful-provider</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies></project>

    實(shí)現(xiàn)代碼:

    1、創(chuàng)建controller

    package com.itheima.nacos.consumer.controller;import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate;@RestController public class RestConsumerController {//要進(jìn)行遠(yuǎn)程,需要知識(shí)提供方的ip和端口@Value("${provider.address}")private String provider;@GetMapping(value = "/service")public String service() {//遠(yuǎn)程調(diào)用服務(wù)RestTemplate restTemplate = new RestTemplate();String result = restTemplate.getForObject("http://" + provider + "/service", String.class);return "consumer invode|" + result;} }

    2、創(chuàng)建啟動(dòng)類

    package com.itheima.nacos.consumer;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication public class SpringRestConsumerBootstrap {public static void main(String[] args) {SpringApplication.run(SpringRestConsumerBootstrap.class, args);} }

    3、配置文件:

    創(chuàng)建application.yml,內(nèi)容如下:

    server:port: 56020#配置服務(wù)提供方的地址(ip和端口) provider:address: 127.0.0.1:56010

    啟動(dòng)項(xiàng)目,訪問http://127.0.0.1:56020/service,輸出以下內(nèi)容:

    服務(wù)發(fā)現(xiàn)流程

    上邊的例子看上去很完美,但是,仔細(xì)考慮以下,此方案對(duì)于微服務(wù)應(yīng)用而言行不通。首先,微服務(wù)可能是部署在云環(huán)境的,服務(wù)實(shí)例的網(wǎng)絡(luò)位置或許是動(dòng)態(tài)分配的。另外,每一個(gè)服務(wù)一般會(huì)有多個(gè)實(shí)例來做負(fù)載均衡,由于宕機(jī)或升級(jí),服務(wù)實(shí)例網(wǎng)絡(luò)地址會(huì)經(jīng)常動(dòng)態(tài)改變。再者,每一個(gè)服務(wù)也可能應(yīng)對(duì)臨時(shí)訪問壓力增加新的服務(wù)節(jié)點(diǎn)。正如下圖所示:

    基于以上的問題,服務(wù)之間如何相互發(fā)現(xiàn)?服務(wù)如何管理?這就是服務(wù)發(fā)現(xiàn)的問題了。

    服務(wù)發(fā)現(xiàn)就是服務(wù)消費(fèi)方通過服務(wù)發(fā)現(xiàn)中心智能發(fā)現(xiàn)服務(wù)提供方,從而進(jìn)行遠(yuǎn)程調(diào)用的過程。

    如下圖:

    上圖中服務(wù)實(shí)例本身并不記錄服務(wù)生產(chǎn)方的網(wǎng)絡(luò)地址,所有服務(wù)實(shí)例內(nèi)部都會(huì)包含服務(wù)發(fā)現(xiàn)客戶端

    (1)在每個(gè)服務(wù)啟動(dòng)時(shí)會(huì)向服務(wù)發(fā)現(xiàn)中心上報(bào)自己的網(wǎng)絡(luò)位置。這樣,在服務(wù)發(fā)現(xiàn)中心內(nèi)部會(huì)形成一個(gè)服務(wù)注冊(cè)表服務(wù)注冊(cè)表是服務(wù)發(fā)現(xiàn)的核心部分,是包含所有服務(wù)實(shí)例的網(wǎng)絡(luò)地址的數(shù)據(jù)庫。

    (2)服務(wù)發(fā)現(xiàn)客戶端會(huì)定期從服務(wù)發(fā)現(xiàn)中心同步服務(wù)注冊(cè)表 ,并緩存在客戶端。

    (3)當(dāng)需要對(duì)某服務(wù)進(jìn)行請(qǐng)求時(shí),服務(wù)實(shí)例通過該注冊(cè)表,定位目標(biāo)服務(wù)網(wǎng)絡(luò)地址。若目標(biāo)服務(wù)存在多個(gè)網(wǎng)絡(luò)地址,則使用負(fù)載均衡算法從多個(gè)服務(wù)實(shí)例中選擇出一個(gè),然后發(fā)出請(qǐng)求。

    總結(jié),在微服務(wù)環(huán)境中,由于服務(wù)運(yùn)行實(shí)例的網(wǎng)絡(luò)地址是不斷動(dòng)態(tài)變化的,服務(wù)實(shí)例數(shù)量的動(dòng)態(tài)變化 ,因此無法使用固定的配置文件來記錄服務(wù)提供方的網(wǎng)絡(luò)地址,必須使用動(dòng)態(tài)的服務(wù)發(fā)現(xiàn)機(jī)制用于實(shí)現(xiàn)微服務(wù)間的相互感知。各服務(wù)實(shí)例會(huì)上報(bào)自己的網(wǎng)絡(luò)地址,這樣服務(wù)中心就形成了一個(gè)完整的服務(wù)注冊(cè)表,各服務(wù)實(shí)例會(huì)通過服務(wù)發(fā)現(xiàn)中心來獲取訪問目標(biāo)服務(wù)的網(wǎng)絡(luò)地址,從而實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)的機(jī)制。

    Nacos 服務(wù)發(fā)現(xiàn)

    Nacos簡介

    服務(wù)發(fā)現(xiàn)產(chǎn)品對(duì)比

    目前市面上用的比較多的服務(wù)發(fā)現(xiàn)中心有:Nacos、Eureka、Consul和Zookeeper。

    從上面對(duì)比可以了解到,Nacos作為服務(wù)發(fā)現(xiàn)中心,具備更多的功能支持項(xiàng),且從長遠(yuǎn)來看Nacos在以后的版本會(huì)支持SpringCLoud+Kubernetes的組合,填補(bǔ) 2 者的鴻溝,在兩套體系下可以采用同一套服務(wù)發(fā)現(xiàn)和配置管理的解決方案,這將大大的簡化使用和維護(hù)的成本。另外,Nacos 計(jì)劃實(shí)現(xiàn) Service Mesh,也是未來微服務(wù)發(fā)展的趨勢(shì)。

    Nacos簡介


    Nacos是阿里的一個(gè)開源產(chǎn)品,它是針對(duì)微服務(wù)架構(gòu)中的服務(wù)發(fā)現(xiàn)、配置管理、服務(wù)治理的綜合型解決方案。

    官方是這樣介紹的:

    Nacos 致力于幫助您發(fā)現(xiàn)、配置和管理微服務(wù)。Nacos 提供了一組簡單易用的特性集,幫助您實(shí)現(xiàn)動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)配置管理、服務(wù)及流量管理。 Nacos 幫助您更敏捷和容易地構(gòu)建、交付和管理微服務(wù)平臺(tái)。Nacos 是構(gòu)建以“服務(wù)”為中心的現(xiàn)代應(yīng)用架構(gòu)的服務(wù)基礎(chǔ)設(shè)施。

    官網(wǎng)地址:https://nacos.io

    Nacos特性

    Nacos主要提供以下四大功能:

    1. 服務(wù)發(fā)現(xiàn)與服務(wù)健康檢查

    ????Nacos使服務(wù)更容易注冊(cè),并通過DNS或HTTP接口發(fā)現(xiàn)其他服務(wù),Nacos還提供服務(wù)的實(shí)時(shí)健康檢查,以防止向不健康的主機(jī)或服務(wù)實(shí)例發(fā)送請(qǐng)求。

    2. 動(dòng)態(tài)配置管理

    ????動(dòng)態(tài)配置服務(wù)允許您在所有環(huán)境中以集中和動(dòng)態(tài)的方式管理所有服務(wù)的配置。Nacos消除了在更新配置時(shí)重新部署應(yīng)用程序,這使配置的更改更加高效和靈活。

    3. 動(dòng)態(tài)DNS服務(wù)

    ????Nacos提供基于DNS 協(xié)議的服務(wù)發(fā)現(xiàn)能力,旨在支持異構(gòu)語言的服務(wù)發(fā)現(xiàn),支持將注冊(cè)在Nacos上的服務(wù)以域名的方式暴露端點(diǎn),讓三方應(yīng)用方便的查閱及發(fā)現(xiàn)。

    4. 服務(wù)和元數(shù)據(jù)管理

    ????Nacos 能讓您從微服務(wù)平臺(tái)建設(shè)的視角管理數(shù)據(jù)中心的所有服務(wù)及元數(shù)據(jù),包括管理服務(wù)的描述、生命周期、服務(wù)的靜態(tài)依賴分析、服務(wù)的健康狀態(tài)、服務(wù)的流量管理、路由及安全策略。

    這里1、3、4說明了服務(wù)發(fā)現(xiàn)的功能特性。

    安裝Nacos Server

    預(yù)備環(huán)境準(zhǔn)備

    Nacos 依賴 Java 環(huán)境來運(yùn)行。如果您是從代碼開始構(gòu)建并運(yùn)行Nacos,還需要為此配置 Maven環(huán)境,請(qǐng)確保是在以下版本環(huán)境中安裝使用:

  • 64 bit OS,支持 Linux/Unix/Mac/Windows,推薦選用 Linux/Unix/Mac;
  • 64 bit JDK 1.8+;下載 & 配置。
  • Maven 3.2.x+;下載 & 配置。
  • 下載源碼或者安裝包

    你可以通過源碼和發(fā)行包兩種方式來獲取 Nacos。

    從 Github 上下載源碼方式
    git clone https://github.com/alibaba/nacos.gitcd nacos/mvn ‐Prelease‐nacos clean install ‐Uls ‐al distribution/target/// change the $version to your actual path cd distribution/target/nacos‐server‐$version/nacos/bin
    下載編譯后壓縮包方式

    您可以從最新穩(wěn)定版本下載 nacos-server-$version.zip 包,本教程使用nacos-server-1.1.3版本。

    下載地址:https://github.com/alibaba/nacos/releases

    下載后解壓:

    unzip nacos‐server‐$version.zip 或者 tar ‐xvf nacos‐server‐$version.tar.gz cd nacos/bin
    啟動(dòng)服務(wù)器

    nacos的默認(rèn)端口是8848,需要保證8848默認(rèn)端口沒有被其他進(jìn)程占用。

    進(jìn)入安裝程序的bin目錄

    Linux/Unix/Mac啟動(dòng)方式

    啟動(dòng)命令(standalone代表著單機(jī)模式運(yùn)行,非集群模式):

    sh startup.sh -m standalone

    如果您使用的是ubuntu系統(tǒng),或者運(yùn)行腳本報(bào)錯(cuò)提示[[符號(hào)找不到,可嘗試如下運(yùn)行:

    bash startup.sh -m standalone
    Windows啟動(dòng)方式

    啟動(dòng)命令:

    cmd startup.cmd

    或者雙擊startup.cmd運(yùn)行文件。

    啟動(dòng)成功,可通過瀏覽器訪問 http://127.0.0.1:8848/nacos ,打開如下nacos控制臺(tái)登錄頁面:

    使用默認(rèn)用戶名:nacos,默認(rèn)密碼:nacos 登錄即可打開主頁面。

    外部mysql數(shù)據(jù)庫支持

    單機(jī)模式時(shí)nacos默認(rèn)使用嵌入式數(shù)據(jù)庫實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ),若想使用外部mysql存儲(chǔ)nacos數(shù)據(jù),需要進(jìn)行以下步驟:

  • 安裝數(shù)據(jù)庫,版本要求:5.6.5+ ,mysql 8 以下
  • 初始化mysql數(shù)據(jù)庫,新建數(shù)據(jù)庫nacos_config,數(shù)據(jù)庫初始化文件${nacoshome}/conf/nacosmysql.sql
  • 修改${nacoshome}/conf/application.properties文件,增加支持mysql數(shù)據(jù)源配置(目前只支持mysql),添加mysql數(shù)據(jù)源的url、用戶名和密碼。
  • spring.datasource.platform=mysqldb.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=root

    RESTful服務(wù)發(fā)現(xiàn)

    測(cè)試環(huán)境

    Spring Cloud是一套微服務(wù)開發(fā)框架集合,包括微服務(wù)開發(fā)的方方頁面,Spring Cloud是一套微服務(wù)開發(fā)的標(biāo)準(zhǔn),集成了很多優(yōu)秀的開源框架,比如有名的Netflix公司的眾多項(xiàng)目。

    Spring Cloud 項(xiàng)目地址:https://spring.io/projects/spring-cloud

    本測(cè)試環(huán)境采用阿里開源的Spring Cloud Alibaba微服務(wù)開發(fā)框架,Spring Cloud Alibaba是阿里巴巴公司基于Spring Cloud標(biāo)準(zhǔn)實(shí)現(xiàn)一套微服務(wù)開發(fā)框架集合,它和Netflix一樣都是Spring Cloud微服務(wù)開發(fā)實(shí)現(xiàn)方案。

    Spring Cloud Alibaba項(xiàng)目地址:https://github.com/alibaba/spring-cloud-alibaba

    通過Spring Cloud Alibaba實(shí)現(xiàn)解決:

  • 服務(wù)發(fā)現(xiàn)客戶端從服務(wù)發(fā)現(xiàn)中心獲取服務(wù)列表
  • 服務(wù)消費(fèi)方通過負(fù)載均衡獲取服務(wù)地址
  • 在nacos-discovery父工程中添加依賴管理

    <dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.1.3.RELEASE</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Greenwich.RELEASE</version><type>pom</type><scope>import</scope></dependency><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>

    分別在服務(wù)提供及服務(wù)消費(fèi)工程中添加依賴,此依賴的作用是服務(wù)發(fā)現(xiàn)

    <!--服務(wù)發(fā)現(xiàn)的客戶端,1、將自己的地址注冊(cè)到服務(wù)發(fā)現(xiàn)中心,2、從服務(wù)發(fā)現(xiàn)中心獲取服務(wù)列表--> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
    服務(wù)注冊(cè)

    在服務(wù)提供工程中的application.yml中配置nacos服務(wù)發(fā)現(xiàn)相關(guān)的配置:

    服務(wù)提供:

    spring:application:name: nacos-restful-provider #服務(wù)名cloud:nacos:discovery:server-addr: 127.0.0.1:8848 #服務(wù)發(fā)現(xiàn)中心地址

    啟動(dòng)nacos

    啟動(dòng)服務(wù)提供

    觀察nacos服務(wù)列表,nacos-restful-provider注冊(cè)成功

    服務(wù)名稱:每個(gè)服務(wù)在服務(wù)注冊(cè)中心的標(biāo)識(shí),相當(dāng)于Java中的類名。

    服務(wù)實(shí)例:網(wǎng)絡(luò)中提供服務(wù)的實(shí)例,具有IP和端口,相當(dāng)于Java中的對(duì)象,一個(gè)實(shí)例即為運(yùn)行在服務(wù)器上的一個(gè)進(jìn)程。

    服務(wù)發(fā)現(xiàn)

    在服務(wù)消費(fèi)工程中的application.yml配置nacos服務(wù)發(fā)現(xiàn)相關(guān)的配置:

    服務(wù)消費(fèi):

    spring:application:name: nacos-restful-consumer #服務(wù)名cloud:nacos:discovery:server-addr: 127.0.0.1:8848 #服務(wù)發(fā)現(xiàn)中心地址

    修改Controller中遠(yuǎn)程調(diào)用的代碼:

    //服務(wù)id即注冊(cè)中心的中的服務(wù)名 private String serviceId = "nacos‐restful‐provider";//通過負(fù)載均衡發(fā)現(xiàn)地址,流程是從服務(wù)發(fā)現(xiàn)中心拿nacos-restful-provider服務(wù)的列表,通過負(fù)載均衡算法獲取一個(gè)地址 @Autowired private LoadBalancerClient loadBalancerClient;@GetMapping(value = "/service1") public String service1() {//遠(yuǎn)程調(diào)用RestTemplate restTemplate = new RestTemplate();//發(fā)現(xiàn)一個(gè)地址ServiceInstance serviceInstance = loadBalancerClient.choose(serviceId);//獲取一個(gè)http://開頭的地址,包括ip和端口URI uri = serviceInstance.getUri();String result = restTemplate.getForObject(uri + "/service", String.class);return "consumer invode|" + result; }

    執(zhí)行流程:

  • 服務(wù)提供方將自己注冊(cè)到服務(wù)注冊(cè)中心
  • 服務(wù)消費(fèi)方從注冊(cè)中心獲取服務(wù)地址
  • 進(jìn)行遠(yuǎn)程調(diào)用
  • 啟動(dòng)消費(fèi)方工程,訪問http://localhost:56020/service

    訪問http://127.0.0.1:8848/nacos,可以看到消費(fèi)方工程也注冊(cè)到nacos中。如下:

    負(fù)載均衡

    在RESTful服務(wù)發(fā)現(xiàn)的流程中,ServiceA通過負(fù)載均衡調(diào)用ServiceB,下邊來了解一下負(fù)載均衡

    負(fù)載均衡就是將用戶請(qǐng)求(流量)通過一定的策略,分?jǐn)傇诙鄠€(gè)服務(wù)實(shí)例上執(zhí)行,它是系統(tǒng)處理高并發(fā)、緩解網(wǎng)絡(luò)壓力和進(jìn)行服務(wù)端擴(kuò)容的重要手段之一。它分為服務(wù)端負(fù)載均衡客戶端負(fù)載均衡

    服務(wù)器端負(fù)載均衡


    在負(fù)載均衡器中維護(hù)一個(gè)可用的服務(wù)實(shí)例清單,當(dāng)客戶端請(qǐng)求來臨時(shí),負(fù)載均衡服務(wù)器按照某種配置好的規(guī)則(負(fù)載均衡算法)從可用服務(wù)實(shí)例清單中選取其一去處理客戶端的請(qǐng)求。這就是服務(wù)端負(fù)載均衡。

    例如Nginx,通過Nginx進(jìn)行負(fù)載均衡,客戶端發(fā)送請(qǐng)求至Nginx,Nginx通過負(fù)載均衡算法,在多個(gè)服務(wù)器之間選擇一個(gè)進(jìn)行訪問。即在服務(wù)器端再進(jìn)行負(fù)載均衡算法分配。

    客戶端服務(wù)負(fù)載均衡


    上邊使用的LoadBalancerClient就是一個(gè)客戶端負(fù)載均衡器,具體使用的是Ribbon客戶端負(fù)載均衡器。

    Ribbon在發(fā)送請(qǐng)求前通過負(fù)載均衡算法選擇一個(gè)服務(wù)實(shí)例,然后進(jìn)行訪問,這是客戶端負(fù)載均衡。即在客戶端就進(jìn)行負(fù)載均衡的分配。

    Ribbon是一個(gè)客戶端負(fù)載均衡器,它的責(zé)任是從一組實(shí)例列表中挑選合適的實(shí)例,如何挑選?取決于負(fù)載均衡策略

    Ribbon核心組件IRule是負(fù)載均衡策略接口,它有如下實(shí)現(xiàn),大家僅做了解:

    • RoundRobinRule(默認(rèn)):輪詢,即按一定的順序輪換獲取實(shí)例的地址。
    • RandomRule:隨機(jī),即以隨機(jī)的方式獲取實(shí)例的地址。
    • AvailabilityFilteringRule: 會(huì)先過濾掉由于多次訪問故障而處于斷路器跳閘狀態(tài)的服務(wù),以及并發(fā)的連接數(shù)量超過閾值的服務(wù),然后對(duì)剩余的服務(wù)列表按照輪詢策略進(jìn)行訪問;
    • WeightedResponseTimeRule: 根據(jù)平均響應(yīng)時(shí)間計(jì)算所有服務(wù)的權(quán)重,響應(yīng)時(shí)間越快,服務(wù)權(quán)重越大,被選中的機(jī)率越高;
      剛啟動(dòng)時(shí),如果統(tǒng)計(jì)信息不足,則使用RoundRobinRule策略,等統(tǒng)計(jì)信息足夠時(shí),會(huì)切換到WeightedResponseTimeRule
    • RetryRule: 先按照RoundRobinRule的策略獲取服務(wù),如果獲取服務(wù)失敗,則在指定時(shí)間內(nèi)會(huì)進(jìn)行重試,獲取可用的服務(wù);
    • BestAvailableRule: 會(huì)先過濾掉由于多次訪問故障而處于斷路器跳閘狀態(tài)的服務(wù),然后選擇一個(gè)并發(fā)量最小的服務(wù);
    • ZoneAvoidanceRule: 默認(rèn)規(guī)則,復(fù)合判斷server所在區(qū)域的性能和server的可用性選擇服務(wù)器;
    準(zhǔn)備測(cè)試環(huán)境

    啟動(dòng)多個(gè)服務(wù)提供方進(jìn)程,為保證端口不沖突,通過啟動(dòng)參數(shù)配置端口,并啟動(dòng)這兩個(gè)進(jìn)程。


    可通過下面方式在服務(wù)消費(fèi)方的 配置文件中修改默認(rèn)的負(fù)載均衡策略:

    nacos-restful-provider:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
    • nacos-restful-provider :即服務(wù)提供方的服務(wù)名稱。
    • com.netflix.loadbalancer.RandomRule:負(fù)載均衡類路徑。
    小結(jié)

    服務(wù)注冊(cè)與發(fā)現(xiàn)流程

  • 服務(wù)提供方將自己注冊(cè)到服務(wù)注冊(cè)中心
  • 服務(wù)消費(fèi)方從注冊(cè)中心獲取服務(wù)地址
  • 通過客戶端負(fù)載均衡器進(jìn)行遠(yuǎn)程調(diào)用
  • Dubbo服務(wù)發(fā)現(xiàn)

    Dubbo是阿里巴巴公司開源的RPC框架,在國內(nèi)有著非常大的用戶群體,但是其微服務(wù)開發(fā)組件相對(duì)Spring Cloud來說并不那么完善。

    Spring Cloud Alibaba微服務(wù)開發(fā)框架集成了Dubbo,可實(shí)現(xiàn)微服務(wù)對(duì)外暴露Dubbo協(xié)議的接口,Dubbo協(xié)議相比RESTful協(xié)議速度更快。

    RPC:RPC是遠(yuǎn)程過程調(diào)用(Remote Procedure Call)的縮寫形式,調(diào)用RPC遠(yuǎn)程方法就像調(diào)用本地方法一樣,非常方便,后邊案例講解具體過程。

    Dubbo服務(wù)架構(gòu)

    下圖是微服務(wù)采用Dubbo協(xié)議的系統(tǒng)架構(gòu)圖:

    組件說明:

  • 客戶端:前端或外部系統(tǒng)
  • API網(wǎng)關(guān):系統(tǒng)唯一入口,路由轉(zhuǎn)發(fā)
  • application-1 :應(yīng)用1,前端提供Http接口,接收用戶的交互請(qǐng)求
  • service-1 :微服務(wù)1,提供業(yè)務(wù)邏輯處理服務(wù)
  • service-2:微服務(wù)2,提供業(yè)務(wù)邏輯處理服務(wù)
  • 交互流程:

  • 網(wǎng)關(guān)負(fù)責(zé)客戶端請(qǐng)求的統(tǒng)一入口,路由轉(zhuǎn)發(fā),前端通過網(wǎng)關(guān)請(qǐng)求后端服務(wù)。
  • 網(wǎng)關(guān)收到前端請(qǐng)求,轉(zhuǎn)發(fā)請(qǐng)求給應(yīng)用。
  • 應(yīng)用接收前端請(qǐng)求,調(diào)用微服務(wù)進(jìn)行業(yè)務(wù)邏輯處理
  • 微服務(wù)為應(yīng)用提供業(yè)務(wù)邏輯處理的支撐,為應(yīng)用提供Dubbo協(xié)議接口
  • 優(yōu)勢(shì)分析:

    此架構(gòu)同時(shí)提供RESTful和Dubbo接口服務(wù),應(yīng)用層對(duì)前端提供RESTful接口,RESTful是互聯(lián)網(wǎng)通用的輕量級(jí)交互協(xié)議,方便前端接入系統(tǒng);微服務(wù)層向應(yīng)用層提供Dubbo接口,Dubbo接口基于RPC通信協(xié)議速度更快。

    本架構(gòu)采用阿里開源的Nacos,集服務(wù)發(fā)現(xiàn)和配置中心于一身,支持RESTful及Dubbo服務(wù)的注冊(cè)。

    測(cè)試環(huán)境

    父工程:仍然使用nacos-dicovery。

    application1:使用nacos-restful-consumer。

    service1微服務(wù):需要新建。

    service2微服務(wù):需要新建。

    api網(wǎng)關(guān):后邊的課程內(nèi)容講解。

    service2微服務(wù)

    service2對(duì)外暴露dubbo協(xié)議的接口,考慮遠(yuǎn)程接口可能 會(huì)被其它多個(gè)服務(wù)調(diào)用,這里將service2的接口單獨(dú)抽取出api工程,service2微服務(wù)工程的結(jié)構(gòu)如下:

    service2-api:存放接口,獨(dú)立成一個(gè)工程方便被其它服務(wù)工程依賴。

    service2-server:存放接口實(shí)現(xiàn),即dubbo服務(wù)的實(shí)現(xiàn)部分。

    定義service2-api

    1、創(chuàng)建service2工程

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>nacos-discovery</artifactId><groupId>com.itheima.nacos</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><groupId>com.itheima.nacos</groupId><artifactId>nacos‐dubbo‐service2</artifactId></project>

    2、創(chuàng)建service2-api工程

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>nacos‐dubbo‐service2</artifactId><groupId>com.itheima.nacos</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><groupId>com.itheima.nacos</groupId><artifactId>service2-api</artifactId></project>

    3、定義接口

    package com.itheima.microservice.service2.api;public interface Service2Api {public String dubboService2(); }
    定義service2-server

    1、創(chuàng)建service2-server工程

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>nacos‐dubbo‐service2</artifactId><groupId>com.itheima.nacos</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><groupId>com.itheima.nacos</groupId><artifactId>service2-server</artifactId><dependencies><dependency><groupId>com.itheima.nacos</groupId><artifactId>service2-api</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies> </project>

    2、定義接口實(shí)現(xiàn)

    注意:使用@org.apache.dubbo.config.annotation.Service標(biāo)記dubbo服務(wù)

    package com.itheima.microservice.service2.service;import com.itheima.microservice.service2.api.Service2Api;@org.apache.dubbo.config.annotation.Service public class Service2ApiImpl implements Service2Api {public String dubboService2() {return "dubboService2";} }

    3、定義啟動(dòng)類

    package com.itheima.microservice.service2;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication public class Service2Bootstrap {public static void main(String[] args) {SpringApplication.run(Service2Bootstrap.class, args);} }

    4、定義配置文件bootstrap.yml

    server:port: 56040 #啟動(dòng)端口 命令行注入spring:application:name: dubbo-service2main:allow-bean-definition-overriding: true # Spring Boot 2.1 需要設(shè)定cloud:nacos:discovery:server-addr: 127.0.0.1:8848 dubbo:scan:# dubbo 服務(wù)掃描基準(zhǔn)包base-packages: com.itheima.microservice.service2.serviceprotocol:# dubbo 協(xié)議name: dubbo# dubbo 協(xié)議端口port: 20891registry:address: nacos://127.0.0.1:8848application:qos-enable: false #dubbo運(yùn)維服務(wù)是否開啟consumer:check: false #啟動(dòng)時(shí)是否檢查依賴的服務(wù)

    5、啟動(dòng)service2-server,啟動(dòng)成功觀察nacos的服務(wù)列表

    6、bootstrap.yml配置說明

    bootstrap.yml內(nèi)容中以dubbo開頭的為dubbo服務(wù) 的配置:

    • dubbo.scan.base-packages ::指定 Dubbo 服務(wù)實(shí)現(xiàn)類的掃描基準(zhǔn)包,將 @org.apache.dubbo.config.annotation.Service 注解標(biāo)注的service暴露為dubbo服務(wù)。
    • dubbo.protocol :Dubbo 服務(wù)暴露的協(xié)議配置,其中子屬性 name 為協(xié)議名稱, port 為dubbo協(xié)議端口可以指定多協(xié)議,如:dubbo.protocol.rmi.port=1099
    • dubbo.registry :Dubbo 服務(wù)注冊(cè)中心配置,其中子屬性 address 的值 nacos://127.0.0.1:8848 ,說明dubbo服務(wù)注冊(cè)到nacos,相當(dāng)于原生dubbo的xml配置中的 <dubbo:registry address="10.20.153.10:9090" />

    bootstrap.yml內(nèi)容的上半部分為SpringCloud的相關(guān)配置:

    • spring.application.name :Spring 應(yīng)用名稱,用于 Spring Cloud 服務(wù)注冊(cè)和發(fā)現(xiàn)。
      該值在 Dubbo Spring Cloud 加持下被視作 dubbo.application.name ,因此,無需再顯示地配置 dubbo.application.name
    • spring.cloud.nacos.discovery : Nacos 服務(wù)發(fā)現(xiàn)與注冊(cè)配置,其中子屬性 server-addr 指定 Nacos 服務(wù)器主機(jī)和端口
    application1調(diào)用service2

    根據(jù)dubbo服務(wù)的架構(gòu)圖,本章節(jié)將nacos-restful-consumer作為application1,實(shí)現(xiàn)application1調(diào)用service2。

    引用service2

    在nacos-restful-consumer工程中引用service2依賴

    在pom.xml中引入service2-api的依賴

    <dependency><groupId>com.itheima.nacos</groupId><artifactId>service2-api</artifactId><version>1.0-SNAPSHOT</version> </dependency>

    引入 spring-cloud-starter-dubbo依賴,它會(huì)根據(jù)接口生成代理對(duì)象

    <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId> </dependency>
    實(shí)現(xiàn)遠(yuǎn)程調(diào)用

    修改nacos-restful-consumer工程的RestConsumerController:

    @org.apache.dubbo.config.annotation.Reference private Service2Api service2Api;@GetMapping(value = "/service2") public String service2() {//遠(yuǎn)程調(diào)用service2String providerResult = service2Api.dubboService2();return "consumer dubbo invoke |" + providerResult; }

    注意:這里的 @Reference 注解是 org.apache.dubbo.config.annotation.Reference

    測(cè)試:啟動(dòng)nacos-restful-consumer工程

    請(qǐng)求:http://127.0.0.1:56020/service2

    顯示:consumer dubbo invoke | dubboService2 表明service2調(diào)用成功。

    service1微服務(wù)

    service1采用和service2相同的工程結(jié)構(gòu)。

    本節(jié)實(shí)現(xiàn)service1對(duì)外暴露dubbo接口,并用實(shí)現(xiàn)service1調(diào)用service2。

    定義service1-api

    1、創(chuàng)建service1工程

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>nacos-discovery</artifactId><groupId>com.itheima.nacos</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><groupId>com.itheima.nacos</groupId><artifactId>nacos‐dubbo‐service1</artifactId></project>

    2、創(chuàng)建service1-api工程

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>nacos‐dubbo‐service1</artifactId><groupId>com.itheima.nacos</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><groupId>com.itheima.nacos</groupId><artifactId>service1‐api</artifactId></project>

    3、定義接口

    package com.itheima.microservice.service1.api;public interface Service1Api {public String dubboService1(); }
    定義service1-server

    1、創(chuàng)建service1-server工程

    由于實(shí)現(xiàn)service1調(diào)用service2,這里需要引入 service2依賴。

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>nacos‐dubbo‐service1</artifactId><groupId>com.itheima.nacos</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><groupId>com.itheima.nacos</groupId><artifactId>service1‐server</artifactId><dependencies><dependency><groupId>com.itheima.nacos</groupId><artifactId>service1‐api</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.itheima.nacos</groupId><artifactId>service2-api</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies></project>

    2、定義接口實(shí)現(xiàn)

    package com.itheima.microservice.service1.service;import com.itheima.microservice.service1.api.Service1Api; import com.itheima.microservice.service2.api.Service2Api;@org.apache.dubbo.config.annotation.Service public class Service1ApiImpl implements Service1Api {@org.apache.dubbo.config.annotation.Referenceprivate Service2Api service2Api;public String dubboService1() {//遠(yuǎn)程調(diào)用service2String s = service2Api.dubboService2();return "dubboService1|" + s;} }

    3、定義啟動(dòng)類

    package com.itheima.microservice.service1;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication public class Service1Bootstrap {public static void main(String[] args) {SpringApplication.run(Service1Bootstrap.class, args);} }

    4、定義配置文件bootstrap.yml

    server:port: 56030 #啟動(dòng)端口 命令行注入spring:application:name: dubbo-service1main:allow-bean-definition-overriding: true # Spring Boot 2.1 需要設(shè)定cloud:nacos:discovery:server-addr: 127.0.0.1:8848 dubbo:scan:# dubbo 服務(wù)掃描基準(zhǔn)包base-packages: com.itheima.microservice.service1.serviceprotocol:# dubbo 協(xié)議name: dubbo# dubbo 協(xié)議端口port: 20881registry:address: nacos://127.0.0.1:8848application:qos-enable: false #dubbo運(yùn)維服務(wù)是否開啟consumer:check: false #啟動(dòng)時(shí)是否檢查依賴的服務(wù)

    5、啟動(dòng)service1-server,啟動(dòng)成功觀察nacos的服務(wù)列表

    application1調(diào)用service1

    參考 application1調(diào)用service2的方法實(shí)現(xiàn)。

    1、在application1引入 service1-api的依賴

    <dependency><groupId>com.itheima.nacos</groupId><artifactId>service1‐api</artifactId><version>1.0-SNAPSHOT</version> </dependency>

    2、在application1的controller中調(diào)用service1接口

    @org.apache.dubbo.config.annotation.Reference private Service1Api service1Api;@GetMapping(value = "/service3") public String service3() {//遠(yuǎn)程調(diào)用service1String providerResult = service1Api.dubboService1();return "consumer dubbo invoke |" + providerResult; }

    3、測(cè)試,請(qǐng)求http://127.0.0.1:56020/service3

    顯示 :consumer dubbo invoke | dubboService1|dubboService2,表明調(diào)用service1成功,service1調(diào)用service2成功。

    服務(wù)發(fā)現(xiàn)數(shù)據(jù)模型

    Namespace 隔離設(shè)計(jì)

    命名空間(Namespace)用于進(jìn)行租戶粒度的隔離,Namespace 的常用場(chǎng)景之一是不同環(huán)境的隔離,例如開發(fā)測(cè)試環(huán)境和生產(chǎn)環(huán)境的資源(如配置、服務(wù))隔離等。

    從一個(gè)租戶(用戶)的角度來看,如果有多套不同的環(huán)境,那么這個(gè)時(shí)候可以根據(jù)指定的環(huán)境來創(chuàng)建不同的namespce,以此來實(shí)現(xiàn)多環(huán)境的隔離。例如,你可能有開發(fā),測(cè)試和生產(chǎn)三個(gè)不同的環(huán)境,那么使用一套nacos 集群可以分別建以下三個(gè)不同的 namespace。如下圖所示:

    從多個(gè)租戶(用戶)的角度來看,每個(gè)租戶(用戶)可能會(huì)有自己的 namespace,每個(gè)租戶(用戶)的配置數(shù)據(jù)以及注冊(cè)的服務(wù)數(shù)據(jù)都會(huì)歸屬到自己的 namespace 下,以此來實(shí)現(xiàn)多租戶間的數(shù)據(jù)隔離。例如超級(jí)管理員分配了三個(gè)租戶,分別為張三、李四和王五。分配好了之后,各租戶用自己的賬戶名和密碼登錄后,創(chuàng)建自己的命名空間。如下圖所示:

    注意: 在此教程編寫之時(shí),nacos多租戶(用戶)功能還在規(guī)劃中。

    命名空間管理

    前面已經(jīng)介紹過,命名空間(Namespace)是用于隔離多個(gè)環(huán)境的(如開發(fā)、測(cè)試、生產(chǎn)),而每個(gè)應(yīng)用在不同環(huán)境的同一個(gè)配置(如數(shù)據(jù)庫數(shù)據(jù)源)的值是不一樣的。因此,我們應(yīng)針對(duì)企業(yè)項(xiàng)目實(shí)際研發(fā)流程、環(huán)境進(jìn)行規(guī)劃。如某軟件公司擁有開發(fā)、測(cè)試、生產(chǎn)三套環(huán)境,那么我們應(yīng)該針對(duì)這三個(gè)環(huán)境分別建立三個(gè)namespace。

    建立好所有namespace后,在配置管理與服務(wù)管理模塊下所有頁面,都會(huì)包含用于切換namespace(環(huán)境)的tab按鈕,如下圖:

    注意:

    namesace 為 public 是 nacos 的一個(gè)保留空間,如果您需要?jiǎng)?chuàng)建自己的 namespace,不要和 public重名,以一個(gè)實(shí)際業(yè)務(wù)場(chǎng)景有具體語義的名字來命名,以免帶來字面上不容易區(qū)分自己是哪一個(gè)namespace。

    在編寫程序獲取配置集時(shí),指定的namespace參數(shù)一定要填寫命名空間ID,而不是名稱

    數(shù)據(jù)模型

    Nacos在經(jīng)過阿里內(nèi)部多年生產(chǎn)經(jīng)驗(yàn)后提煉出的數(shù)據(jù)模型,則是一種服務(wù)-集群-實(shí)例的三層模型,這樣基本可以滿足服務(wù)在所有場(chǎng)景下的數(shù)據(jù)存儲(chǔ)和管理。

    nacos服務(wù)發(fā)現(xiàn)的數(shù)據(jù)模型如下:

    服務(wù)

    ??????對(duì)外提供的軟件功能,通過網(wǎng)絡(luò)訪問預(yù)定義的接口。

    服務(wù)名

    ??????服務(wù)提供的標(biāo)識(shí),通過該標(biāo)識(shí)可以唯一確定要訪問的服務(wù)。

    實(shí)例

    ??????提供一個(gè)或多個(gè)服務(wù)的具有可訪問網(wǎng)絡(luò)地址(IP:Port)的進(jìn)程,啟動(dòng)一個(gè)服務(wù),就產(chǎn)生了一個(gè)服務(wù)實(shí)例。

    元信息

    ??????Nacos數(shù)據(jù)(如配置和服務(wù))描述信息,如服務(wù)版本、權(quán)重、容災(zāi)策略、負(fù)載均衡策略、鑒權(quán)配置、各種自定義標(biāo)簽 (label),從作用范圍來看,分為服務(wù)級(jí)別的元信息、集群的元信息及實(shí)例的元信息。

    集群

    ??????服務(wù)實(shí)例的集合,服務(wù)實(shí)例組成一個(gè)默認(rèn)集群, 集群可以被進(jìn)一步按需求劃分,劃分的單位可以是虛擬集群,相同集群下的實(shí)例才能相互感知。

    通過數(shù)據(jù)模型可知:

    ??????應(yīng)用通過Namespace、Service、Cluster(DEFAULT)的配置,描述了該服務(wù)向哪個(gè)環(huán)境(如開發(fā)環(huán)境)的哪個(gè)集群注冊(cè)實(shí)例。

    例子如下:

    ??????指定namespace的id:4d2fe0e0-1544-4033-b06e-73fd3c1ce03e(注意根據(jù)自己環(huán)境設(shè)置namespace的id)

    ??????指定集群名稱:DEFAULT表示默認(rèn)集群,可不填寫

    例如可以在nacos-restful-consumer工程的application.yml配置文件中添加如下:

    spring:application:name: nacos-restful-consumer #服務(wù)名cloud:nacos:discovery:server-addr: 127.0.0.1:8848 #服務(wù)發(fā)現(xiàn)中心地址namespace: 4d2fe0e0-1544-4033-b06e-73fd3c1ce03e #開發(fā)環(huán)境cluster-name: DEFAULT # 默認(rèn)集群,可不填寫

    測(cè)試:先啟動(dòng)service2,再啟動(dòng)service1,最后啟動(dòng)consumer工程。

    啟動(dòng)nacos-restful-consumer工程,但是會(huì)報(bào)錯(cuò),提示找不到nacos‐dubbo‐service2工程提供的接口,因?yàn)閚acos-restful-consumer是在dev環(huán)境下開發(fā)(我們配置的namespace為dev的id),而nacos‐dubbo‐service2是在public環(huán)境下開發(fā),所以還要在nacos‐dubbo‐service2工程中的配置文件中配置namespace和nacos-restful-consumer工程配置一樣的namespace,另外還有其他依賴的工程都要配置namespace

    注意:

    集群作為實(shí)例的隔離,相同集群的實(shí)例才能相互感知。

    namespace、cluster-name若不填寫都將采取默認(rèn)值,namespace的默認(rèn)是public命名空間,cluster-name的默認(rèn)值為DEFAULT集群。

    Nacos配置管理

    理解配置中心

    什么是配置

    應(yīng)用程序在啟動(dòng)和運(yùn)行的時(shí)候往往需要讀取一些配置信息,配置基本上伴隨著應(yīng)用程序的整個(gè)生命周期,比如:數(shù)據(jù)庫連接參數(shù)、啟動(dòng)參數(shù)等。

    配置主要有以下幾個(gè)特點(diǎn)

    1、配置是獨(dú)立于程序的只讀變量

    ??????配置對(duì)于程序是只讀的,程序通過讀取配置來改變自己的行為,但是程序不應(yīng)該去改變配置

    2、配置伴隨應(yīng)用的整個(gè)生命周期

    ??????配置貫穿于應(yīng)用的整個(gè)生命周期,應(yīng)用在啟動(dòng)時(shí)通過讀取配置來初始化,在運(yùn)行時(shí)根據(jù)配置調(diào)整行為。

    ??????比如:啟動(dòng)時(shí)需要讀取服務(wù)的端口號(hào)、系統(tǒng)在運(yùn)行過程中需要讀取定時(shí)策略執(zhí)行定時(shí)任務(wù)等。

    3、配置可以有多種加載方式

    ??????常見的有程序內(nèi)部hard code,配置文件,環(huán)境變量,啟動(dòng)參數(shù),基于數(shù)據(jù)庫等

    4、配置需要治理

    ??????同一份程序在不同的環(huán)境(開發(fā),測(cè)試,生產(chǎn))、不同的集群(如不同的數(shù)據(jù)中心)經(jīng)常需要有不同的配置,所以需要有完善的環(huán)境、集群配置管理

    什么是配置中心

    在微服務(wù)架構(gòu)中,當(dāng)系統(tǒng)從一個(gè)單體應(yīng)用,被拆分成分布式系統(tǒng)上一個(gè)個(gè)服務(wù)節(jié)點(diǎn)后,配置文件也必須跟著遷移(分割),這樣配置就分散了,不僅如此,分散中還包含著冗余,如下圖:

    下圖顯示了配置中心的功能,配置中心將配置從各應(yīng)用中剝離出來,對(duì)配置進(jìn)行統(tǒng)一管理,應(yīng)用自身不需要自己去管理配置。

    配置中心的服務(wù)流程如下:

  • 用戶在配置中心更新配置信息。
  • 服務(wù)A和服務(wù)B及時(shí)得到配置更新通知,從配置中心獲取配置。
  • 總得來說,配置中心就是一種統(tǒng)一管理各種應(yīng)用配置的基礎(chǔ)服務(wù)組件。

    在系統(tǒng)架構(gòu)中,配置中心是整個(gè)微服務(wù)基礎(chǔ)架構(gòu)體系中的一個(gè)組件,如下圖,它的功能看上去并不起眼,無非就是配置的管理和存取,但它是整個(gè)微服務(wù)架構(gòu)中不可或缺的一環(huán)。

    總結(jié)一下,在傳統(tǒng)巨型單體應(yīng)用紛紛轉(zhuǎn)向細(xì)粒度微服務(wù)架構(gòu)的歷史進(jìn)程中,配置中心是微服務(wù)化不可缺少的一個(gè)系統(tǒng)組件,在這種背景下中心化的配置服務(wù)即配置中心應(yīng)運(yùn)而生,一個(gè)合格的配置中心需要滿足如下特性:

    • 配置項(xiàng)容易讀取和修改
    • 分布式環(huán)境下應(yīng)用配置的可管理性,即提供遠(yuǎn)程管理配置的能力
    • 支持對(duì)配置的修改的檢視以把控風(fēng)險(xiǎn)
    • 可以查看配置修改的歷史記錄
    • 不同部署環(huán)境下應(yīng)用配置的隔離性
    主流配置中心對(duì)比

    目前市面上用的比較多的配置中心有:Spring Cloud Config、Apollo、Nacos和Disconf等。

    由于Disconf不再維護(hù),下面主要對(duì)比一下Spring Cloud Config、Apollo和Nacos。

    從配置中心角度來看,性能方面Nacos的讀寫性能最高,Apollo次之,Spring Cloud Config依賴Git場(chǎng)景不適合開放的大規(guī)模自動(dòng)化運(yùn)維API。

    功能方面Apollo最為完善,nacos具有Apollo大部分配置管理功能,而Spring Cloud Config不帶運(yùn)維管理界面,需要自行開發(fā)。

    Nacos的一大優(yōu)勢(shì)是整合了注冊(cè)中心、配置中心功能,部署和操作相比Apollo都要直觀簡單,因此它簡化了架構(gòu)復(fù)雜度,并減輕運(yùn)維及部署工作。

    綜合來看,Nacos的特點(diǎn)和優(yōu)勢(shì)還是比較明顯的,下面我們一起進(jìn)入Nacos的世界。

    Nacos配置管理

    發(fā)布配置

    首先在nacos發(fā)布配置,nacos-restful-consumer服務(wù)從nacos讀取配置。

    瀏覽器訪問 http://127.0.0.1:8848/nacos ,打開nacos控制臺(tái),并點(diǎn)擊菜單配置管理->配置列表

    在Nacos添加如下的配置:

    nacos-restful-consumer:

    Namespace: public Data ID: nacos-restful-consumer.yaml Group : DEFAULT_GROUP 配置格式: YAML 配置內(nèi)容: common:name: application1 config



    獲取配置

    要想從配置中心獲取配置在nacos-restful-consumer工程的pom.xml文件在添加nacos-config的依賴:

    <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>

    在bootstrap.yml添加配置:

    spring:cloud:nacos:config:server-addr: 127.0.0.1:8848 #配置中心地址file-extension: yaml #指定配置文件的擴(kuò)展名,配置文件名稱根據(jù)application.name的名稱加擴(kuò)展名拼裝,為nacos-restful-consumer.yamlgroup: DEFAULT_GROUP

    注意:要使用配置中心就要在 bootstrap.yml 中來配置,bootstrap.yml配置文件的加載順序要比application.yml要優(yōu)先。

    在nacos-restful-consumer工程的controller中增加獲取配置的web訪問端點(diǎn)/configs,通過標(biāo)準(zhǔn)的spring @Value方式。

    @Value("${common.name}") private String common_name;@GetMapping(value = "/configs") public String getvalue() {return common_name; }

    基于上面的例子,若要實(shí)現(xiàn)配置的動(dòng)態(tài)更新,只需要進(jìn)行如下改造:

    // 注入配置文件上下文,實(shí)現(xiàn)配置的動(dòng)態(tài)更新 @Autowired ConfigurableApplicationContext applicationContext;@GetMapping(value = "/configs") public String getvalue() {String name = applicationContext.getEnvironment().getProperty("common.name");String addr = applicationContext.getEnvironment().getProperty("common.addr");return name + "|" + addr; }

    我們通過nacos控制臺(tái)更新common.name的配置值,再次訪問web端點(diǎn)/configs,發(fā)現(xiàn)應(yīng)用程序能夠獲取到最新的配置值,說明spring-cloud-starter-alibaba-nacos-config 支持配置的動(dòng)態(tài)更新。

    注意:可以通過配置 spring.cloud.nacos.config.refresh.enabled=false 來關(guān)閉動(dòng)態(tài)刷新

    配置管理模型

    對(duì)于Nacos配置管理,通過Namespace、group、Data ID能夠定位到一個(gè)配置集。

    配置集(Data ID)

    在系統(tǒng)中,一個(gè)配置文件通常就是一個(gè)配置集,一個(gè)配置集可以包含了系統(tǒng)的各種配置信息,例如,一個(gè)配置集可能包含了數(shù)據(jù)源、線程池、日志級(jí)別等配置項(xiàng)。每個(gè)配置集都可以定義一個(gè)有意義的名稱,就是配置集的ID即Data ID。

    配置項(xiàng)

    配置集中包含的一個(gè)個(gè)配置內(nèi)容就是配置項(xiàng)。它代表一個(gè)具體的可配置的參數(shù)與其值域,通常以 key=value 的形式存在。例如我們常配置系統(tǒng)的日志輸出級(jí)別 (logLevel=INFO|WARN|ERROR) 就是一個(gè)配置項(xiàng)。

    配置分組(Group)

    配置分組是對(duì)配置集進(jìn)行分組,通過一個(gè)有意義的字符串(如 Buy 或 Trade )來表示,不同的配置分組下可以有相同的配置集(Data ID)。

    當(dāng)您在 Nacos 上創(chuàng)建一個(gè)配置時(shí),如果未填寫配置分組的名稱,則配置分組的名稱默認(rèn)采用 DEFAULT_GROUP 。

    配置分組的常見場(chǎng)景:可用于區(qū)分不同的項(xiàng)目或應(yīng)用,例如:學(xué)生管理系統(tǒng)的配置集可以定義一個(gè)group為:STUDENT_GROUP。

    命名空間(Namespace)

    命名空間(namespace)可用于進(jìn)行不同環(huán)境的配置隔離。例如可以隔離開發(fā)環(huán)境、測(cè)試環(huán)境和生產(chǎn)環(huán)境,因?yàn)樗鼈兊呐渲每赡芨鞑幌嗤?#xff0c;或者是隔離不同的用戶,不同的開發(fā)人員使用同一個(gè)nacos管理各自的配置,可通過namespace隔離。不同的命名空間下,可以存在相同名稱的配置分組(Group) 或 配置集。

    最佳實(shí)踐

    Nacos抽象定義了Namespace、Group、Data ID的概念,具體這幾個(gè)概念代表什么,取決于我們把它們看成什么,這里推薦給大家一種用法,如下圖:

    • Namespace:代表不同環(huán)境,如開發(fā)、測(cè)試、生產(chǎn)環(huán)境。
    • Group:代表某項(xiàng)目,如XX醫(yī)療項(xiàng)目、XX電商項(xiàng)目
    • DataId:每個(gè)項(xiàng)目下往往有若干個(gè)工程,每個(gè)配置集(DataId)是一個(gè)工程的主配置文件

    獲取某配置集的代碼

    獲取配置集需要指定:

    1、nacos服務(wù)地址,必須指定

    2、namespace,如不指定默認(rèn)public,在config中指定namespace,例子如下:

    config:server‐addr: 127.0.0.1:8848 # 配置中心地址file‐extension: yamlnamespace: a1f8e863‐3117‐48c4‐9dd3‐e9ddc2af90a8 # 開發(fā)環(huán)境group: DEFAULT_GROUP # xx業(yè)務(wù)組

    3、group,如不指定默認(rèn) DEFAULT_GROUP,見上邊第2點(diǎn)的例子。

    4、dataId,必須指定,名稱為應(yīng)用名稱+配置文件擴(kuò)展名

    自定義擴(kuò)展的 Data Id 配置

    ext-config擴(kuò)展配置

    Spring Cloud Alibaba Nacos Config可支持自定義 Data Id 的配置。 一個(gè)完整的配置案例如下所示:

    spring:application:name: nacos-restful-consumer #服務(wù)名cloud:nacos:discovery:server-addr: 127.0.0.1:8848 #服務(wù)發(fā)現(xiàn)中心地址#namespace: f5eec3c1-4f05-40cd-964a-c8d44f342ab4 #指定命名空間的idconfig:server-addr: 127.0.0.1:8848 #配置中心地址file-extension: yaml #指定配置文件的擴(kuò)展名,配置文件名稱根據(jù)application.name的名稱加擴(kuò)展名拼裝,為nacos-restful-consumer.yamlgroup: DEFAULT_GROUP#cluster-name: DEFAULT# config external configuration# 1、Data Id group:組名,refresh:動(dòng)態(tài)刷新ext-config[0]:data-id: ext-config-common01.yamlgroup: COMMON_GROUPrefresh: trueext-config[1]:data-id: ext-config-common02.yamlgroup: COMMON_GROUPrefresh: trueext-config[2]:data-id: ext-config-http.yamlgroup: COMMON_GROUPrefresh: true

    可以看到:

    • 通過 spring.cloud.nacos.config.ext-config[n].data-id 的配置方式來支持多個(gè) Data Id 的配置。
    • 通過 spring.cloud.nacos.config.ext-config[n].group 的配置方式自定義 Data Id 所在的組,不明確配置的話,默認(rèn)是 DEFAULT_GROUP。
    • 通過 spring.cloud.nacos.config.ext-config[n].refresh 的配置方式來控制該 Data Id 在配置變更時(shí),是否支持應(yīng)用中可動(dòng)態(tài)刷新, 感知到最新的配置值。默認(rèn)是不支持的。
    注意

    spring.cloud.nacos.config.ext-config[n].data-id 的值必須帶文件擴(kuò)展名,文件擴(kuò)展名既可支持properties,又可以支持 yaml/yml。

    此時(shí) spring.cloud.nacos.config.file-extension 的配置對(duì)自定義擴(kuò)展配置的 Data Id 文件擴(kuò)展名沒有影響。

    測(cè)試

    配置ext-config-common01.yaml:

    配置ext-config-common02.yaml:

    編寫測(cè)試代碼:

    @GetMapping(value = "/configs") public String getvalue1() {String name = applicationContext.getEnvironment().getProperty("common.name");String addr = applicationContext.getEnvironment().getProperty("common.addr");return name + "|" + addr; }

    重啟nacos-restful-consumer工程

    訪問:http://127.0.0.1:56020/configs

    通過測(cè)試發(fā)現(xiàn):

    擴(kuò)展配置優(yōu)先級(jí)是 spring.cloud.nacos.config.ext-config[n].data-id 其中 n 的值越大,優(yōu)先級(jí)越高。

    通過內(nèi)部相關(guān)規(guī)則(應(yīng)用名、擴(kuò)展名 )自動(dòng)生成相關(guān)的 Data Id 配置的優(yōu)先級(jí)最大。

    案例

    案例需求如下:

    1、抽取servlet公用的配置到獨(dú)立的配置文件ext-config-http.yaml中,配置文件內(nèi)容如下:

    #HTTP格式配置 spring:http:encoding:charset: utf-8force: trueenabled: truemessages:encoding: UTF-8 #tomcat頭信息和訪問路徑配置 server:tomcat:remote-ip-header: x-forwarded-forprotocol-header: x-forwarded-protoservlet:context-path: /ause-forward-headers: true

    2、如果有context-path的個(gè)性配置可以單獨(dú)設(shè)置

    實(shí)現(xiàn)如下:

    1、抽取servlet公用的配置到獨(dú)立的配置文件

    在nacos-restful-consumer中添加擴(kuò)展配置文件,下圖中紅色框內(nèi)為指定的配置文件名稱

    在nacos中添加擴(kuò)展配置文件,下圖中紅色框內(nèi)是servlet公用的配置內(nèi)容。

    發(fā)布配置,重啟nacos-restful-consumer

    訪問http://127.0.0.1:56020/a/configs驗(yàn)證配置是否生效

    2、如果有context-path的個(gè)性配置可以單獨(dú)設(shè)置

    這里我們需要對(duì) nacos-restful-consumer的context-path 設(shè)置為根路徑,如何實(shí)現(xiàn)?

    方案1:修改 ext-config-http.yaml中context-path 為根路徑,但是此文件定義為公用配置文件,其它服務(wù)可使用了,此方案不可行。

    方案2:在nacos-restful-consumer.yaml中定義context-path為根路徑,因?yàn)閚acos-restful-consumer.yaml單獨(dú)屬于nacos-restful-consumer工程,且nacos-restful-consumer.yaml的優(yōu)先級(jí)比ext-config-http.yaml高,所以此方案可行。

    在nacos中配置nacos-restful-consumer.yaml,如下:

    重啟nacos-restful-consumer工程。

    測(cè)試,請(qǐng)求:http://127.0.0.1:56020/configs

    總結(jié)

    Nacos用來干什么?

    ??????Nacos是阿里巴巴公司開源的項(xiàng)目,它用來實(shí)現(xiàn)配置中心和服務(wù)注冊(cè)中心。

    什么是服務(wù)發(fā)現(xiàn)?

    ??????在微服務(wù)架構(gòu)中一個(gè)業(yè)務(wù)流程需要多個(gè)微服務(wù)通過網(wǎng)絡(luò)接口調(diào)用完成業(yè)務(wù)處理,服務(wù)消費(fèi)方從服務(wù)注冊(cè)中心獲取服務(wù)提供方的地址,從而進(jìn)行遠(yuǎn)程調(diào)用,這個(gè)過程叫做服務(wù)發(fā)現(xiàn)。

    服務(wù)發(fā)現(xiàn)的流程是什么?
  • 服務(wù)發(fā)現(xiàn)的客戶端從服務(wù)注冊(cè)中心獲取服務(wù)列表
  • 服務(wù)消費(fèi)方通過客戶端負(fù)載均衡獲取服務(wù)實(shí)例地址,進(jìn)行遠(yuǎn)程調(diào)用。
  • 什么是配置中心?

    ??????在微服務(wù)架構(gòu)中為了統(tǒng)一管理各各微服務(wù)的配置信息專門設(shè)置配置中心,配置中心就是一種統(tǒng)一管理各種應(yīng)用配置的基礎(chǔ)服務(wù)組件。

    配置中心的應(yīng)用流程是什么?
  • 發(fā)布配置,將配置信息發(fā)布到配置中心。
  • 獲取配置,配置中心客戶端得到配置中心的通知,從配置中心獲取配置。
  • Spring Cloud是什么?

    ??????Spring Cloud是一套微服務(wù)開發(fā)框架集合,包括微服務(wù)開發(fā)的方方頁面,Spring Cloud是一套微服務(wù)開發(fā)的標(biāo)準(zhǔn),集成了很多優(yōu)秀的開源框架,比如有名的Netflix公司的眾多項(xiàng)目。

    Spring Cloud Alibaba是什么?

    ??????Spring Cloud Alibaba是阿里巴巴公司基于Spring Cloud標(biāo)準(zhǔn)實(shí)現(xiàn)一套微服務(wù)開發(fā)框架集合,它和Netflix一樣都是Spring Cloud微服務(wù)開發(fā)實(shí)現(xiàn)方案。

    Dubbo服務(wù)開發(fā)流程是什么?
    1、定義api工程。

    ??????方便其它服務(wù)原來api工程,遠(yuǎn)程調(diào)用dubbo服務(wù)。

    2、定義api實(shí)現(xiàn)工程。

    ??????service實(shí)現(xiàn)類使用 @org.apache.dubbo.config.annotation.Service注解標(biāo)記為dubbo服務(wù)。

    3、服務(wù)消費(fèi)方開發(fā)

    ??????引入api工程依賴,使用org.apache.dubbo.config.annotation.Reference注解注入service,發(fā)起遠(yuǎn)程調(diào)用

    代碼倉庫

    總結(jié)

    以上是生活随笔為你收集整理的闪聚支付-第1章-Nacos-服务发现与配置管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 665566综合网| 蜜桃视频一区二区三区在线观看 | 精品久久久久久亚洲 | 三级黄网站 | 色精品| 日韩精品国产一区 | 操女人的逼逼 | 国产精品女同 | 亚洲大尺度在线观看 | 99色综合网| 亚洲va久久久噜噜噜久久天堂 | 97人妻精品一区二区三区动漫 | 亚洲一二区在线 | 岛国成人在线 | 狠狠操影视 | 丰满人妻一区二区三区53视频 | 久久免费看毛片 | 岛国精品在线播放 | 天天躁日日躁狠狠躁av麻豆男男 | 亚洲一区二区三区四区在线观看 | 蜜桃av网| 国产毛片毛片毛片毛片毛片毛片 | 欧美午夜精品一区二区三区电影 | 米奇久久 | 欧美极品少妇xxxxⅹ猛交 | 99涩涩| 在线sese | 人人爽人人澡 | 日韩成人高清视频 | 国产精品九九九九九 | 日本大奶少妇 | 久久h视频| 五月激情六月 | 六月婷婷色 | 欧美乱码精品一区二区三区 | 国产精品女教师 | 一区二区在线视频观看 | 福利资源在线观看 | 欧美在线一二三 | 日韩爱爱爱 | 中日韩精品视频 | 最近2018年手机中文字幕版 | 黄色网战在线观看 | 青青草精品视频 | 美女扒开尿口给男人看 | 开心激情深爱 | 久久久精品日韩 | 久久乐国产精品 | 久久久久久一区二区 | 日日爱886 | 久久精品国产99国产精品 | 亚洲最新在线 | 看全色黄大色黄大片女一次牛 | 国产日韩欧美高清 | 精品国产乱码久久久久久蜜臀 | 日韩精品久久久久久久 | 欧美第1页 | 国产黄色在线 | 亚洲天堂午夜 | 亚洲av无码国产精品久久久久 | 欧美影院一区二区 | 亚洲精品一区久久久久久 | 一区二区三区美女视频 | 男人的天堂在线播放 | 亚洲午夜久久久久久久久红桃 | 免费视频91 | 操网| 成人手机在线免费视频 | 五月天在线播放 | 亚洲色图25p| a免费毛片 | 午夜探花视频 | 日本韩国欧美一区二区 | 青娱乐在线视频免费观看 | 日本免费网站 | 成年人激情网 | 91视频中文字幕 | 日日日视频 | 六月丁香色婷婷 | 久久黄网站 | 福利在线免费视频 | 在线中文字幕一区二区 | 日免费视频 | wwwxxx色 | 日韩一级二级三级 | videosex抽搐痉挛高潮 | av在线www| 麻豆传谋在线观看免费mv | 婷婷丁香综合 | 午夜影院色 | 玖玖精品 | 欧美破处大片 | 亚洲欧美综合视频 | re久久| 一级黄色大片免费 | 国内视频精品 | 日本做爰三级床戏 | 亚洲精选国产 | 日韩不卡在线观看 |