国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

.NET Core + K8S + Apollo 玩轉(zhuǎn)配置中心

共 21595字,需瀏覽 44分鐘

 ·

2020-08-20 23:42

1.引言

Apollo(阿波羅)是攜程框架部門研發(fā)的分布式配置中心,能夠集中化管理應(yīng)用不同環(huán)境、不同集群的配置,配置修改后能夠?qū)崟r(shí)推送到應(yīng)用端,并且具備規(guī)范的權(quán)限、流程治理等特性,適用于微服務(wù)配置管理場(chǎng)景。

如官網(wǎng)所述:Apollo 是攜程打造的開(kāi)源配置中心,GitHub的星星也快點(diǎn)滿22K,因此足見(jiàn)它的成熟度和社區(qū)活躍度。因此最近在做配置中心選型的時(shí)候,經(jīng)過(guò)一番預(yù)演,最終敲定Apollo。

Apollo作為微服務(wù)體系中必不可少的基礎(chǔ)服務(wù),其架構(gòu)設(shè)計(jì)和基本使用我們不得不有所了解。

因此本文接下來(lái)將主要來(lái)介紹如何基于Helm快速部署Apollo集群至K8S,并與.NET Core應(yīng)用進(jìn)行集成,同時(shí)介紹下如何平滑遷移配置到Apollo。

本文具有詳細(xì)的部署步驟,建議動(dòng)手實(shí)操。
部署Chart包和Demo已上傳至GitHub:K8S.NET.Apollo,可收藏備用。

2. Apollo 架構(gòu)一覽

在部署之前,需要了解Apollo的基礎(chǔ)架構(gòu),以便在后續(xù)部署工作的展開(kāi)。

關(guān)于其的解讀,我這里就不再詳細(xì)展開(kāi),但以下幾點(diǎn)還是要有所了解,感興趣的可以直接看官網(wǎng)詳細(xì)介紹:Apollo配置中心設(shè)計(jì)。

  1. Config Service提供配置的讀取、推送等功能,服務(wù)對(duì)象是Apollo客戶端

  2. Admin Service提供配置的修改、發(fā)布等功能,服務(wù)對(duì)象是Apollo Portal(管理界面)

  3. Config Service和Admin Service都是多實(shí)例、無(wú)狀態(tài)部署,需要通過(guò)注冊(cè)中心進(jìn)行服務(wù)注冊(cè)和發(fā)現(xiàn)

  4. 注冊(cè)中心默認(rèn)采用的是Eureka,在K8S中由Service充當(dāng)

  5. Apollo客戶端通過(guò)注冊(cè)中心獲取Config Service服務(wù)列表進(jìn)行配置讀取

  6. Apollo Portal通過(guò)注冊(cè)中心獲取Admin Service服務(wù)列表進(jìn)行配置管理

基于上面對(duì)Apollo的介紹,其物理架構(gòu)總結(jié)起來(lái)就是:

  1. 每一套環(huán)境都必須擁有自己獨(dú)立的Config Service 和 Admin Service 以及獨(dú)立ConfigDB。

  2. 多套環(huán)境可以公用一套Apollo Portal 進(jìn)行管理,Portal擁有獨(dú)立PortalDB。

3. 基于Helm部署到K8S

因?yàn)锳pollo 1.7.0版本增加了基于Kubernetes原生服務(wù)發(fā)現(xiàn)的部署模式,來(lái)替換內(nèi)置的Eureka,所以在整體部署上有很大簡(jiǎn)化,同時(shí)官方也提供了Helm Charts,讓Apollo更加易于開(kāi)箱即用。下面就以部署一套測(cè)試環(huán)境為例講解一下Apollo的部署要點(diǎn)。(部署至本機(jī)Docker Desktop Local K8S環(huán)境)。

環(huán)境要求:Kubernetes 1.10+,Helm 3

3.1 搭建 Apollo Config&Portal DB

從上圖的物理架構(gòu)上來(lái)看,首先要部署好Config DB和PortalDB。關(guān)于DB的搭建,建議直接使用bitnami/mysqlchart搭建。搭建步驟如下:

> helm repo add bitnami https://charts.bitnami.com/bitnami
> helm repo list
> helm repo update
> helm search repo bitnami/mysql
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/mysql 6.14.8 8.0.21 Chart to create a Highly available MySQL cluster

執(zhí)行helm包的安裝,需要自定義配置文件,也就是values.yaml。我們可以先行下載 mysql chart包。

之所以選擇將chart包下載到本地,是為了確保后續(xù)維護(hù)能夠基于一致的chart包版本。避免因?yàn)閳?zhí)行helm repo update導(dǎo)致chart包版本自動(dòng)升級(jí),而不自知。

> helm pull bitnami/mysql --untar  //下載并解包
mysql
├── Chart.yaml
├── ci
│ └── values-production.yaml
├── files
│ └── docker-entrypoint-initdb.d
│ └── README.md
├── README.md
├── templates
│ ├── initialization-configmap.yaml
│ ├── master-configmap.yaml
│ ├── master-statefulset.yaml
│ ├── master-svc.yaml
│ ├── NOTES.txt
│ ├── secrets.yaml
│ ├── serviceaccount.yaml
│ ├── servicemonitor.yaml
│ ├── slave-configmap.yaml
│ ├── slave-statefulset.yaml
│ ├── slave-svc.yaml
│ └── _helpers.tpl
├── values-production.yaml
└── values.yaml

根據(jù)官網(wǎng)分布式部署指南中所示,其提供了DB的初始化腳本用來(lái)分別創(chuàng)建ApolloConfigDBApolloPortalDB。因此可以直接將以上SQL腳本下載到mysql chart的files/docker-entrypoint-initdb.d目錄下,這樣在部署mysql實(shí)例時(shí)就會(huì)自動(dòng)執(zhí)行腳本創(chuàng)建數(shù)據(jù)庫(kù)。

> cd mysql/files/docker-entrypoint-initdb.d
> curl https://raw.githubusercontent.com/ctripcorp/apollo/master/scripts/sql/apolloportaldb.sql > apolloportaldb.sql //下載apolloportaldb.sql
> curl https://raw.githubusercontent.com/ctripcorp/apollo/master/scripts/sql/apolloconfigdb.sql > apolloconfigdb.sql 下載apolloconfigdb.sql
> ls

Directory: C:\Users\Shengjie\k8s\helm\charts\apollo\mysql\files\docker-entrypoint-initdb.d

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 8/12/2020 11:01 PM 21291 apolloconfigdb.sql
-a--- 8/12/2020 10:56 PM 16278 apolloportaldb.sql
-a--- 8/9/2020 6:26 PM 242 README.md

然后復(fù)制values.yaml并命名為dev-mysql-values.yaml。然后修改核心配置:

  1. global.storageClass=hostpath
    可通過(guò)kubectl get sc查看集群支持的storageClass,我這邊選擇默認(rèn)的hostpath。其創(chuàng)建的pv的默認(rèn)回收策略為delete,也就意味著卸載mysql,數(shù)據(jù)直接刪除,這點(diǎn)需要注意?。?!如果需要保留測(cè)試數(shù)據(jù),請(qǐng)更新storageClass。

  2. root.password=root
    修改默認(rèn)root用戶的密碼

修改完畢后,執(zhí)行以下腳本進(jìn)行安裝:

> kubectl create ns db #創(chuàng)建單獨(dú)db命名空間
> helm install mysql-apollo . -f dev-mysql-values.yaml -n db
NAME: mysql-apollo
LAST DEPLOYED: Sun Aug 16 11:01:18 2020
NAMESPACE: db
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Please be patient while the chart is being deployed

Tip:

Watch the deployment status using the command: kubectl get pods -w --namespace db

Services:

echo Master: mysql-apollo.db.svc.cluster.local:3306
echo Slave: mysql-apollo-slave.db.svc.cluster.local:3306

Administrator credentials:

echo Username: root
echo Password : $(kubectl get secret --namespace db mysql-apollo -o jsonpath="{.data.mysql-root-password}" | base64 --decode)

To connect to your database:

1. Run a pod that you can use as a client:

kubectl run mysql-apollo-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mysql:8.0.21-debian-10-r17 --namespace db --command -- bash

2. To connect to master service (read/write):

mysql -h mysql-apollo.db.svc.cluster.local -uroot -p my_database

3. To connect to slave service (read-only):

mysql -h mysql-apollo-slave.db.svc.cluster.local -uroot -p my_database

To upgrade this helm chart:

1. Obtain the password as described on the 'Administrator credentials' section and set the 'root.password' parameter as shown below:

ROOT_PASSWORD=$(kubectl get secret --namespace db mysql-apollo -o jsonpath="{.data.mysql-root-password}" | base64 --decode)
helm upgrade mysql-apollo bitnami/mysql --set root.password=$ROOT_PASSWORD

按照上面提示,驗(yàn)證數(shù)據(jù)庫(kù)成功創(chuàng)建:

> kubectl run mysql-apollo-client --rm --tty -i --restart='Never' --image  docker.io/bitnami/mysql:8.0.21-debian-10-r17
--namespace db --command -- bash # 創(chuàng)建mysql-client pod
I have no name!@mysql-apollo-client:/$ mysql -h mysql-apollo.db.svc.cluster.local -uroot -proot # 連接至master 節(jié)點(diǎn)
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 61
Server version: 8.0.21 Source distribution

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases; # 查看databases;
+--------------------+
| Database |
+--------------------+
| ApolloConfigDB |
| ApolloPortalDB |
| information_schema |
| my_database |
| mysql |
| performance_schema |
| sys |
+--------------------+
7 rows in set (0.00 sec)

mysql> use ApolloConfigDB; # 切換至ApolloConfigDB;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables; # 查看數(shù)據(jù)表;
+--------------------------+
| Tables_in_ApolloConfigDB |
+--------------------------+
| AccessKey |
| App |
| AppNamespace |
| Audit |
| Cluster |
| Commit |
| GrayReleaseRule |
| Instance |
| InstanceConfig |
| Item |
| Namespace |
| NamespaceLock |
| Release |
| ReleaseHistory |
| ReleaseMessage |
| ServerConfig |
+--------------------------+
16 rows in set (0.01 sec)

至此,確認(rèn)Apollo ConfigDB和PortalDB搭建成功。

3.2 搭建 Apollo Config Service

搭建Apollo Service 需要添加攜程官方chart倉(cāng)庫(kù):

> helm repo add apollo http://ctripcorp.github.io/apollo/charts
> helm search repo apollo
NAME CHART VERSION APP VERSION DESCRIPTION
apollo/apollo-portal 0.1.0 1.7.0 A Helm chart for Apollo Portal
apollo/apollo-service 0.1.0 1.7.0 A Helm chart for Apollo Config Service and Apol...

從上可知,主要包含兩個(gè)chart,分別用來(lái)部署service和portal。下來(lái)研究下apollo/apollo-service 這個(gè)chart。老規(guī)矩,先把chart包下載下來(lái):

> helm pull apollo/apollo-service --untar
apollo-service
├── Chart.yaml
├── templates
│ ├── deployment-adminservice.yaml
│ ├── deployment-configservice.yaml
│ ├── NOTES.txt
│ ├── service-adminservice.yaml
│ ├── service-configdb.yaml
│ ├── service-configservice.yaml
│ └── _helpers.tpl
└── values.yaml

從上面的樹(shù)形圖來(lái)看,主要就是用來(lái)部署config service 和 admin service。緊接著,復(fù)制一個(gè)values.yaml,命名為dev-apollo-svc-values.yaml。主要修改以下配置:

  1. configdb.host=mysql-apollo.db
    指定configdb的主機(jī),因?yàn)槭窃诩簝?nèi)部,直接使用服務(wù)名即可

  2. configdb.password=root
    指定configdb的秘密

修改后的配置如下:

configdb:
name: apollo-configdb
# apolloconfigdb host
host: "mysql-apollo.db"
port: 3306
dbName: ApolloConfigDB
# apolloconfigdb user name
userName: "root"
# apolloconfigdb password
password: "root"
....

其他配置可以暫定不動(dòng),緊接著執(zhí)行以下命令進(jìn)行安裝:

> kubectl create ns apollo # 創(chuàng)建apollo 命名空間
> helm install --dry-run --debug apollo-dev-svc . -f dev-apollo-svc-values.yaml -n apollo # 測(cè)試安裝,驗(yàn)證模板生成的資源文件是否有誤
> helm install apollo-dev-svc . -f dev-apollo-svc-values.yaml -n apollo
NAME: apollo-dev-svc
LAST DEPLOYED: Sun Aug 16 11:17:38 2020
NAMESPACE: apollo
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Get meta service url for current release by running these commands:
echo http://apollo-dev-svc-apollo-configservice.apollo:8080

For local test use:
export POD_NAME=$(kubectl get pods --namespace apollo -l "app=apollo-dev-svc-apollo-configservice" -o jsonpath="{.items[0].metadata.name}")
echo http://127.0.0.1:8080
kubectl --namespace apollo port-forward $POD_NAME 8080:8080

這里要記住上面的meta service url:http://apollo-dev-svc-apollo-configservice.apollo:8080

那如何確認(rèn)正確部署了呢:

> kubectl get all -n apollo # 查看apollo命名空間下部署的資源
NAME READY STATUS RESTARTS AGE
pod/apollo-dev-svc-apollo-adminservice-7d4468ff46-gw6h4 1/1 Running 0 3m26s
pod/apollo-dev-svc-apollo-configservice-58d6c44cd4-n4qk9 1/1 Running 0 3m26s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/apollo-dev-svc-apollo-adminservice ClusterIP 10.99.251.14 8090/TCP 3m26s
service/apollo-dev-svc-apollo-configservice ClusterIP 10.108.121.201 8080/TCP 3m26s

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/apollo-dev-svc-apollo-adminservice 1/1 1 1 3m26s
deployment.apps/apollo-dev-svc-apollo-configservice 1/1 1 1 3m26s

NAME DESIRED CURRENT READY AGE
replicaset.apps/apollo-dev-svc-apollo-adminservice-7d4468ff46 1 1 1 3m26s
replicaset.apps/apollo-dev-svc-apollo-configservice-58d6c44cd4 1 1 1 3m26s

從上可知暴露了兩個(gè)服務(wù)configservice和adminservice,來(lái)嘗試將configservice進(jìn)行端口轉(zhuǎn)發(fā)到本地端口來(lái)看一下。

> kubectl port-forward service/apollo-dev-svc-apollo-configservice 8080:8080 -n apollo # 轉(zhuǎn)發(fā)configservice到本地服務(wù)
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080

使用瀏覽器訪問(wèn)?localhost:8080,可以看到輸出[{"appName":"apollo-configservice","instanceId":"apollo-configservice:http://apollo.shisheng.wang/config-svc","homepageUrl":"http://apollo.shisheng.wang/config-svc"},{"appName":"apollo-adminservice","instanceId":"apollo-adminservice:http://apollo.shisheng.wang/admin-svc","homepageUrl":"http://apollo.shisheng.wang/admin-svc"}]。

至此說(shuō)明,Apollo Service 搭建成功。

3.3 搭建 Apollo Portal Service

同樣,先來(lái)下載portal chart包,并研究下目錄結(jié)構(gòu):

> helm pull apollo/apollo-portal --untar
apollo-portal
├── Chart.yaml
├── templates
│ ├── deployment-portal.yaml
│ ├── ingress-portal.yaml
│ ├── NOTES.txt
│ ├── service-portal.yaml
│ ├── service-portaldb.yaml
│ └── _helpers.tpl
└── values.yaml

從上可知,portal 相對(duì)來(lái)說(shuō),主要是構(gòu)建portal服務(wù),并可以通過(guò)ingress暴露服務(wù)。復(fù)制一個(gè)values.yaml,命名為dev-apollo-portal-values.yaml。主要修改以下配置:

  1. ingress.enabled=true
    啟用ingress,并通過(guò)注解設(shè)置ingress controller,因?yàn)閜ortal是個(gè)有狀態(tài)服務(wù),所以要關(guān)注Sessiion狀態(tài)維持。以下主要是針對(duì)nginx-ingress-controller的配置,如果使用的其他的ingress-controller請(qǐng)注意更改。(nginx-ingress-controller的安裝,這里就不具體展開(kāi)了,可以簡(jiǎn)單執(zhí)行helm install nginx bitnaim/nginx-ingress-controller?安裝就好了。)

ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "route"
hosts:
- host: "apollo.demo.com"
paths: ["/"]
tls: []
  1. 指定配置源 ,主要是envs和metaServers兩個(gè)配置項(xiàng):
    config.envs=dev
    config.metaServers.dev=http://apollo-dev-svc-apollo-configservice.apollo:8080(上面部署apollo service輸出的apollo service url)如果同時(shí)啟用開(kāi)發(fā)、測(cè)試和生產(chǎn)環(huán)境??梢耘渲脼椋?code style="margin: 1px 5px;line-height: 1.8;vertical-align: middle;display: inline-block;overflow-x: auto;padding-right: 5px !important;padding-left: 5px !important;font-family: "Courier New", sans-serif !important;font-size: 12px !important;background-color: rgb(245, 245, 245) !important;border-width: 1px !important;border-style: solid !important;border-color: rgb(204, 204, 204) !important;border-radius: 3px !important;">envs: "dev,uat,prd",metaServers 分別指定對(duì)應(yīng)環(huán)境的配置即可。
    以下是只啟用開(kāi)發(fā)環(huán)境的配置:

config:
# spring profiles to activate
profiles: "github,auth"
# specify the env names, e.g. dev,pro
envs: "dev"
# specify the meta servers, e.g.
# dev: http://apollo-configservice-dev:8080
# pro: http://apollo-configservice-pro:8080
metaServers:
dev: http://apollo-svc-dev-apollo-configservice.apollo:8080
# dev: http://apollo.shisheng.wang
# specify the context path, e.g. /apollo
contextPath: ""
# extra config files for apollo-portal, e.g. application-ldap.yml
files: {}
  1. portaldb.host=mysql-apollo.db & portaldb.password=root
    指定portaldb的主機(jī)和密碼

portaldb:
name: apollo-portaldb
# apolloportaldb host
host: mysql-apollo.db
port: 3306
dbName: ApolloPortalDB
# apolloportaldb user name
userName: root
# apolloportaldb password
password: root

其他配置可以暫定不動(dòng),緊接著執(zhí)行以下命令進(jìn)行安裝:

> Helm install --dry-run --debug apollo-dev-portal . -f dev-apollo-portal-values.yaml -n apollo # 測(cè)試安裝,驗(yàn)證模板生成的資源文件是否有誤
> Helm install apollo-dev-portal . -f dev-apollo-portal-values.yaml -n apollo
PS C:\Users\Shengjie\k8s\helm\charts\apollo\apollo-portal> Helm install apollo-dev-portal . -f dev-apollo-portal-values.yaml -n apollo
NAME: apollo-dev-portal
LAST DEPLOYED: Sun Aug 16 11:53:18 2020
NAMESPACE: apollo
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Get apollo portal url by running these commands:
http://apollo.demo.com/

到這一步,如果需要本地可以訪問(wèn),還需要修改本地hosts,添加127.0.0.1 apollo.demo.com。然后打開(kāi)你的Browser輸入http://apollo.demo.com/,就可以訪問(wèn)了。默認(rèn)用戶密碼是:[apollo/admin]。

3.4. 暴露 config service

以上部署的是開(kāi)發(fā)環(huán)境,但要想開(kāi)發(fā)環(huán)境要訪問(wèn)到config service,我們還需要些小動(dòng)作。這個(gè)時(shí)候就需要修改apollo service的chart模板,在template目錄增加ingress-configservice.yaml文件,內(nèi)容如下:

# ingress-configservice.yaml
{{- if .Values.configService.ingress.enabled -}}{{- $fullName := include "apollo.configService.fullName" . -}}{{- $svcPort := .Values.configService.service.port -}}{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}
kind: Ingress
metadata:
name: {{ $fullName }}
labels:
{{- include "apollo.service.labels" . | nindent 4 }}
{{- with .Values.configService.ingress.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
{{- if .Values.configService.ingress.tls }}
tls:
{{- range .Values.configService.ingress.tls }}
- hosts:
{{- range .hosts }}
- {{ . | quote }}
{{- end }}
secretName: {{ .secretName }}
{{- end }}{{- end }}
rules:
{{- range .Values.configService.ingress.hosts }}
- host: {{ .host | quote }}
http:
paths:
{{- range .paths }}
- path: {{ . }}
backend:
serviceName: {{ $fullName }}
servicePort: {{ $svcPort }}
{{- end }}
{{- end }}{{- end }}

然后修改values.yamlconfigService節(jié)點(diǎn)下增加ingress配置選項(xiàng):

configService:
name: apollo-configservice
fullNameOverride: ""
replicaCount: 2
containerPort: 8080
image:
repository: apolloconfig/apollo-configservice
pullPolicy: IfNotPresent
imagePullSecrets: []
service:
fullNameOverride: ""
port: 8080
targetPort: 8080
type: ClusterIP
# 以下為新增ingress配置項(xiàng)
ingress:
enabled: false
annotations: {}
hosts:
- host: ""
paths: []
tls: []

然后再修改上面我們創(chuàng)建的dev-apollo-svc-values.yaml下的configService節(jié)點(diǎn),添加對(duì)應(yīng)ingressconfig.configServiceUrlOverride配置:

configService:
name: apollo-configservice
fullNameOverride: ""
replicaCount: 1
containerPort: 8080
image:
repository: apolloconfig/apollo-configservice
pullPolicy: IfNotPresent
imagePullSecrets: []
service:
fullNameOverride: ""
port: 8080
targetPort: 8080
type: ClusterIP
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /$2
hosts:
- host: "apollo.demo.com"
paths: ["/config-svc(/|$)(.*)"]
tls: []
liveness:
initialDelaySeconds: 100
periodSeconds: 10
readiness:
initialDelaySeconds: 30
periodSeconds: 5
config:
# spring profiles to activate
profiles: "github,kubernetes"
# override apollo.config-service.url: config service url to be accessed by apollo-client
configServiceUrlOverride: "http://apollo.demo.com/config-svc"
# override apollo.admin-service.url: admin service url to be accessed by apollo-portal
adminServiceUrlOverride: ""

修改完畢,執(zhí)行以下命令升級(jí)apollo service:

> helm upgrade apollo-service-dev . -f dev-apollo-svc-values.yaml -n apollo
NAME: apollo-service-dev
LAST DEPLOYED: Tue Aug 18 14:20:41 2020
NAMESPACE: apollo
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Get meta service url for current release by running these commands:
echo http://apollo-service-dev-apollo-configservice.apollo:8080

For local test use:
export POD_NAME=$(kubectl get pods --namespace apollo -l "app=apollo-service-dev-apollo-configservice" -o jsonpath="{.items[0].metadata.name}")
echo http://127.0.0.1:8080
kubectl --namespace apollo port-forward $POD_NAME 8080:8080
> curl http://apollo.demo.com/config-svc
[{"appName":"apollo-configservice","instanceId":"apollo-configservice:http://apollo.demo.com/config-svc","homepageUrl":"http://apollo.demo.com/config-svc"},{"appName":"apollo-adminservice","instanceId":"apollo-adminservice:http://apollo-service-dev-apollo-adminservice.apollo:8090","homepageUrl":"http://apollo-service-dev-apollo-adminservice.apollo:8090"}]

從上面的輸出可以看到,現(xiàn)在已經(jīng)可以通過(guò)http://apollo.demo.com/config-svc讀取metaServer配置了,后面本地開(kāi)發(fā)環(huán)境就可以通過(guò)這個(gè)鏈接來(lái)讀取Apollo的配置。

4. .NET Core 集成Apollo

這一部分我就快速帶過(guò)了,執(zhí)行以下命令創(chuàng)建項(xiàng)目,并引入apolloswagger相關(guān)包:

> dotnet new webapi -n K8S.NET.Apollo
> cd K8S.NET.Apollo
> dotnet add package Com.Ctrip.Framework.Apollo.Configuration
> dotnet add package Swashbuckle.AspNetCore

修改appsettings.json增加apollo配置:

{
"AllowedHosts": "*",
"apollo": {
"AppId": "test",
"MetaServer": "http://apollo.demo.com/config-svc",
"Env": "Dev"
}
}

修改Program.cs,添加Apollo配置源如下:

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(configBuilder =>
{
configBuilder.AddApollo(configBuilder.Build().GetSection("apollo"))
.AddDefault()
.AddNamespace("TEST1.connectionstrings", "ConnectionStrings")
.AddNamespace("logging", ConfigFileFormat.Json)
;
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup();
});

修改Startup.cs,添加Swagger集成,方便測(cè)試:

public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = this.GetType().Namespace, Version = "v1" });
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", $"{this.GetType().Namespace} V1");
c.RoutePrefix = string.Empty;
});

//...
}

添加ApolloController,增加以下測(cè)試代碼:

namespace K8S.NET.Apollo.Controllers
{
[ApiController]
[Route("[controller]/[action]")]
public class ApolloController : Controller
{
private readonly IConfiguration _configuration;
public ApolloController(IConfiguration configuration)
{
_configuration = configuration;
}

[HttpGet("key")]
public IActionResult GetLogLevelSection()
{
var key = "Logging:LogLevel";
var val = _configuration.GetSection(key).Get();
return Ok($"{key}:{JsonSerializer.Serialize(val)}");
}

[HttpGet("key")]
public IActionResult GetString(string key)
{
var val = _configuration.GetValue<string>(key);
return Ok($"{key}:{val}");
}

[HttpGet("key")]
public IActionResult GetConnectionStrings(string key)
{
var val = _configuration.GetConnectionString(key);
return Ok($"{key}:{val}");
}
}

public class LoggingOptions : Dictionary<string, string>
{
}
}

登錄Apollo Portal,添加test項(xiàng)目,并增加以下配置,并發(fā)布。

本地調(diào)試,就能夠獲取云端配置,另外Apollo同時(shí)會(huì)同步一份配置到本地目錄:c:/opt/data/test/config-cache。這樣就可以保證即使無(wú)法建立云端連接,也可以正常加載本地配置。
執(zhí)行以下命令,進(jìn)行配置讀取和驗(yàn)證:

> curl https://localhost:5001/Apollo/GetLogLevelSection
Logging:LogLevel:{"Default":"Information","Microsoft":"Warning","Microsoft.Hosting.Lifetime":"Information"}
> curl https://localhost:5001/Apollo/GetString/key?key=name
name:Shengjie
> curl https://localhost:5001/Apollo/GetConnectionStrings/key?key=Default
Default:Server=mu3ne-mysql;port=3306;database=mu3ne0001;user id=root;password=abc123;AllowLoadLocalInfile=true

5.配置遷移指北

相信采用Apollo的絕大多數(shù)都不是一開(kāi)始就用的,都是再配置逐漸復(fù)雜之后,才進(jìn)行遷移的。我也不例外,之前是用K8S的ConfigMap來(lái)做配置管理。下面就來(lái)講下遷移指南,我將其分為兩種模式:

  1. 偷懶模式
    如果想改動(dòng)最小,就直接將項(xiàng)目配置繼續(xù)以Json格式維護(hù)到Apollo的私有命名空間下。

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, builder) =>
{
builder.AddApollo(builder.Build().GetSection("apollo"))
.AddDefault()
.AddNamespace("appsettings",ConfigFileFormat.Json);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup();
});
  1. 強(qiáng)迫癥模式
    也有人考慮,既然上Apollo,就要用到它的特性,因此對(duì)現(xiàn)有配置就要分門別類。哪些是公用的,哪些是私有的。對(duì)于公用的就要定義到公共的命名空間下。公共命名空間的配置格式只有Properties格式,因此需要將Json轉(zhuǎn)為Properties。比如針對(duì)Logging配置可以借助網(wǎng)站 json2properties converter進(jìn)行在線轉(zhuǎn)換。如下所示:

如果真這樣做,你就錯(cuò)了,你會(huì)發(fā)現(xiàn)最終的日志配置不生效。這是因?yàn)?code style="margin: 1px 5px;line-height: 1.8;vertical-align: middle;display: inline-block;overflow-x: auto;padding-right: 5px !important;padding-left: 5px !important;font-family: "Courier New", sans-serif !important;font-size: 12px !important;background-color: rgb(245, 245, 245) !important;border-width: 1px !important;border-style: solid !important;border-color: rgb(204, 204, 204) !important;border-radius: 3px !important;">properties格式是以.進(jìn)行分割,而.NET Core是用:來(lái)識(shí)別節(jié)點(diǎn)配置, 因此properties配置按:分割就好了,如下所示,以下兩種配置等效:

6. 最后

以上,相信若能夠動(dòng)手實(shí)操,你將收獲匪淺。

本文Demo和Chart包的完整配置已上傳至Github:K8S.NET.Apollo,請(qǐng)按需取用。


瀏覽 61
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 97精品综合久久| 免费成人国产| 国产激情视频在线| 亚洲免费性爱视频| 国产精品tv| 色天使视频| 在线观看免费黄网站| 欧美三级性爱视频| 99精品视频北条麻妃国产版| 国产免费黄色视频| 一区二区三区视频免费| 亚洲免费在线播放| 欧美成人黄色| 午夜成人鲁丝片午夜精品| 欧美日韩国产性爱| 一区二区三级片| 久久久久亚洲AV无码专区成人| 久久A视频| 国产av高清| AV麻豆| 欧美日韩在线一区| 成人黄片免费| 97精品人人妻人人| 精品一区无码| 亚洲女人视频| 大香蕉尹人在线观看| 中文字幕亚洲天堂| 亚洲国产成人久久| 国产黄色电影在线| 猛操美女| 99久久久国产精品无码| 一本道视频在线| 成人不卡视频| 女人自慰网站在线观看| 日韩免费| 77777色婷婷| 国产丨熟女丨国产熟女视频| 无码精品人妻一区二区三区漫画 | 毛片A级| 操B影院| 国产av二区| 日日爱99| 污污污污污www在线观看优势| 久久成人18免费网站波多野结衣| 国产色秘乱码一区二区三区| 日本一级特黄电影| 亚洲成人影片| 亚洲人成电影| 国产九色91回来了| 丁香五月网| 人人干人人爽| 久久水蜜桃| H片在线播放| 无码人妻精品一区二区三千菊电影| 亚洲爱| 91叉叉叉| 中文电视剧字幕在线播放免费视频| 黄色片国产| 日日操日日摸| 亚洲国产成人一区二区| 欧美三p| 久草视频在线免费看| 日韩欧美高清在线| 欧美高清一区二区| 日韩1区2区| 特级西西人体www高清大胆| a片免费网址| 亚洲网站在线免费观看| 免费无码婬片AAAAA片| 夜夜嗨AV一区二区三区啊| 91麻豆精品在线| 国产精品无码久久久久成人app | 国产熟女露脸普通话对白| 粉嫩99精品99久久久久| 色悠悠久久综合| 99久久精品国产一区二区三区| 无码乱码在线观看| 中文字幕免费观看视频| 日韩中出视频| 草草影院国产第一页| 青青草无码在线| 777777国产7777777| 成人免费网站黄| 国产精品一区二区三区在线| 岛国无码av| 91在线成人| 毛片高清无码| 国产精品93333333| 无码一卡| 午夜成人免费视频| 午夜无码人妻AV| 欧美精品一二三| 天天爽视频| 欧美成人色图| 少妇视频| 成人三级视频| 日韩欧美亚洲| 加勒比无码人妻| 国产激情免费视频| 松岛枫在线视频| 色欲成人AV| 亚洲天堂美女| 一区二区av在线| 亚洲黄色小电影| 在线观看无码高清视频| 久久久久久久伊人| 翔田千里91| 午夜福利爱爱视频| 欧美成人免费电影| 五月伊人激情| 免费操逼视频网站| 99中文字幕| 亚洲免费无码| 国外成人在线视频老鸭窝| 中文字幕播放| 黄网站欧美内射| 亚洲AV国产| 亚洲午夜成人精品一区二区| 天天干天天射天天爽| 一级a免一级a做免费线看内祥| 国产一区二区三区在线观看免费视频免费视频免费视频 | 午夜三级福利| 国内特级毛片| 国产黄色不卡| 美女裸体视频网站| 天天干狠狠| 特黄无码| 天堂a√在线8| 黄片小视频在线观看| 99这里有精品视频| www.yw尤物| 色中文字幕| 成人黄色在线观看| 无码国产传媒精品一区| 日本一区二区三区视频在线观看| 免费国产黄色视频网站| 怡春院院成人免费视频| 国产一级A| www.日韩欧美| 无码三级在线观看| 搡BBB搡BBBB搡BBBB-百度| 精品黄色毛片| 国产极品无码| 91九色蝌蚪91POR成人| 亚洲V无码| 成人1区| 一级黄色电影网| 欧美中文字幕在线观看| 丝袜制服中文字幕无码专区| 五月亭亭在线视频| 人人射人人射| 亚洲男人的天堂视频网在线观看+720P | 成人午夜天堂| 大地资源38页| 操逼在线免费观看| 色中文字幕| 另类老妇性BBBWBBW| 日本www视频| 国产系列精品AV| 精品成人在线视频| 国产精品无码专区AV免费播放| 夜夜爽天天爽| 精品无码视频| 亚洲区无码| 亚洲无码中文字幕视频| a久久| JLZZJLZZ亚洲女人| 国产人成一区二区三区影院| 欧美成人18| 黄片www.| 91在线成人电影| 韩国三级HD久久精品HD| 老鸭窝在线观看视频| 51成人网站| 高清av免费| 性爱福利导航| 大地影视中文第三页最新在线观看 | 超碰福利导航| av天堂中文在线| 久久无码精品| av干在线| 蝌蚪窝在线视频观看| 男女乱伦视频| 午夜成人网站| 日韩一区二区三区视频| 999精品视频在线| 97亚洲国产| 国产熟女露脸普通话对白| 日本韩国无码| 国产一级在线观看| 欧美A级黄片| 免费在线观看无码| 色综合天天综合| 日本大香蕉视频| 手机看片福利永久| 思思热免费视频| 黄色草逼视频| 波多野结衣亚洲无码| 国产AV资源| 五月天激情啪啪| 国产人妖网站| av午夜福利| 果冻传媒A片一二三区| 伊人综合久久| 无码乱码在线观看| 亚洲无码一级片| 黄色三级视频| 国产卡一卡二在线观看| 中文字幕北条麻妃在线| 99精品久久久久久无码| 黄片久久久| 欧美伊人网| 求毛片网址| 婷婷色中文网| 成人视频在线观看黄色18| 国产18| 日韩和的一区二区| 日韩久久高清| 777Av| 成人免费观看的毛视频| 久久久久久久久免费视频| 熟妇高潮| 特极西西444WWW大胆无码| 中文字幕av高清片,中文在线观看| 成年片免费观看网站免费观看,亚洲+欧... | 亚洲综合一区二区| 亚洲精品成人av| 九七AV| 色色777| 亚洲欧美中文字幕| 黄色A片网址| 亚洲国产激情视频| 日韩成人无码AV| 中文在线最新版天堂8| 久久久久久伊人| 日本高潮视频| 青草伊人网| 91大神网址| 欧美性夜黄A片爽爽免费视频| 欧美日韩成人在线| 黄片网址在线观看| 亚洲性爱小说| 成人在线黄色视频| 婷婷乱伦| 密臀久久| 中文字幕专区| 自拍偷拍福利视频网站| 亚洲综合在线观看视频| 国产高清无码视频在线观看| 久久婷婷青青| 亚洲欧美第一页| 午夜精品无码| 婚闹不堪入目A片| 日韩一区二区三| 爱爱毛片| 男人天堂网AV| 视频一区18| 天天干天天操天天| 91精品国产乱码久久久久| 五月天一区二区| 91在线精品秘一区二区黄瓜| 国产一级做a爱免费视频| 久久久久久久大香蕉| 精品福利在线观看| 国内无码视频| 日本中文字幕在线播放| 就去se超碰| 久久久黄色电影| 婷婷午夜精品久久久久久性色AV | 啊啊啊网站| 久久久电影| 久久公开视频| 成人A片在线观看| 亚洲素人无码| 在线无码不卡| 国产一卡二卡| 五月天福利影院| 国产主播福利| 免费欧美三级片| 日韩在线视频一区二区三区| 三级片无码| 欧美日韩综合网| 麻豆二区| 国产AV久| 性无码一区二区三区在线观看| 亚洲免费观看高清| 亚洲综合一区二区三区| 成人做爰100部免费网站| 大黑逼网| 99re6热在线精品视频| 少妇视频| 爱搞视频| 日本成人精品| 国产AV网| 人人看人人摸人人搞| 国产中文| 黄色大片在线| 无码av网站| 一本色道无码人妻精品| 婷久久| 人人操人人爽人人爱| 狼人综合在线| 成人三级视频| 超碰在线人妻| 国产精品性爱| 99视频在线免费播放| 亲子伦一区二区三区| 国产绿奴09-01| 污污污污污www网站免费观看| AV解说| 日韩亚洲精品中文字幕| 一级A片免费观看| 亚洲视频在线观| 99久在线精品99re8热| 人人爽亚洲AV人人爽AV人人片 | 蜜臀久久久99久久久久久久| 欧一美一婬一伦一区| 欧美大鸡巴在线观看| 午夜无码熟妇丰满人妻| 成人一区二区三区四区五区| 久久久久久高清毛片一级| 国产精品可站18| 欧美狠狠撸| 久久香蕉人| 久久久久97| 中文字幕日韩精品人妻| 激情爱爱网| 成人自拍偷拍视频| 午夜ww| 欧美激情一区二区三区| 中国操逼毛片| 日韩欧美色图| 午夜福利老司机| 人妻日韩| 四虎亚洲无码| 国产av黄色| 免费看黄视频| 狠狠干影院| 婷婷色吧| 亚洲第一页在线观看| 99插插插| 自拍偷拍视频网站| 久久国产精彩视频| 久久久久久免费视频| 日韩无码黄色视频| 欧美老逼| 国产精品成人免费| 国产成人av在线播放| 成年人激情网| av免费在线播放| 国产乱叫456在线| 黄色免费在线观看视频| 婷婷无码成人精品俺来俺去| 在线观看高清无码视频| 无码一区二区黑人猛烈视频网站 | 四川少妇搡bbbb搡bbbb| 日本99热| 四川妇搡BBBB搡BBBB| 国产三级av在线| 国产高清激情| 极品人妻疯狂3p超刺激| 99热网址| 狠狠狠狠狠狠| 搡bbbb| 精品无码视频| 日本理论片一道本| 操逼视频,黄色大全| 久激情内射婷内射蜜桃欧美一级| 国产毛片一照区| a免费观看| 九色偷拍| 国产欧美综合一区二区三区| 欧美一级片网站| 爱爱一区| 中文字幕免费在线观看视频| 91在线亚洲| 久久久精品欧美| 女人A片一级黄色| 欧美性受XXXX黑人XYX性爽冫| 亚洲性爱一区二区三区| 丰滿人妻一区二区三区| 人妻综合第一页| 一区二区三区毛片| 亚洲欧美天堂| 中文字幕片av| 北条麻妃在线中文字幕| 国产成人在线精品| 成人午夜无码视频| AV片免费看| 天天拍天天干| 欧美在线免费视频| 国产毛片久久久久久国产毛片| 日本内射在线观看| 国产免费性爱视频| www.狠狠| 69Av视频| 麻豆传媒猫爪| 欧美国产日本| 大香蕉中文视频| 九九色视频| 可以免费看的黄色| 日韩A片免费| av资源免费观看| 樱桃Av| 亚洲精品午夜福利| 色欲五月天| 国产欧美欧洲| 特级毛片片A片AAAAAA| 成人精品一区日本无码网站suv/| 久久久一区二区| 日本中文字幕不卡| 电家庭影院午夜| 久久草草热国产精品| 国产在线色| 免费成人黄视频| 大黑人荫蒂BBBBBBBBB| 亚洲无码黄色片| 91精品久久久久久| 在线看一区| 淫色综合| 强伦轩人妻一区二区电影| 美日韩精品| 亚洲一线播放| 国产一级片免费观看| 91综合视频在线播放| 最新版本日本亚洲色| 亚洲高清无码在线免费观看| 亚洲操逼AV| 有码中文字幕| 成人网站高清无码| 青青激情视频| 日韩欧美三级| 国产av三级片| 精品多人P群无码视频| 天天干,夜夜操| 亚洲AV永久无码成人| 美女在线扣穴| 黄片网站免费看| 日韩在线看片| 九九色在线视频| 精品人妻一区二区| 91在线一区二区三区| 欧美日韩h| 日本一区二区在线| 婷婷久久综合久| 国产夫妻av| 成人AV无码| 亚洲无套内射| 黑种人配中国少妇HD| 欧美中文字幕在线| 授乳奶水x88MAV| 操b视频在线免费观看| 精品黄片| 91精品国产麻豆国产自产在线 | 俺也去也| 骚逼久久| 精品中文字幕在线播放| 亚洲,制服,综合,中文| 无码动漫av| 秋霞网一区二区| 欧美a在线| 亚洲成人色色| 欧美不卡在线观看| 91麻豆福利在线观看| 人人色人人干| 91人人人人| 亚洲日韩精品在线视频| 无码一级片| 91九色在线| 午夜爱爱爱| 久久人妻无码中文字幕系列| 中文在线观看视频| 日韩久久中文字幕| 亚洲AV中文在线| 成人久久久| 爱爱视频欧美| 亚洲一区久久| 91最新国产| 久草人妻| 欧美成人三级在线| 色噜噜人妻av中文字幕| 91免费在线视频观看| 少妇搡BBBB搡BBBB毛多多| 中文电视剧字幕在线播放免费视频| 久久精品视频免费看| 操逼91小视频| 成人电影一区| 亚洲AV无码精品久久一区二区| 黄页网站视频| 青娱乐三级在线免| 久久嫩草精品久久久久| 67194国产| 成人国产无码| 国产AV无码区亚洲| 91人妻人人爽| 国产欧美日韩一区二区三区| 北条麻妃中文字幕旡码| 色婷操逼| 搡BBB| 成人毛片在线播放| 精品无码一区二区三区蜜桃李宗瑞 | 亚洲中文字幕码mv| 精品乱子伦一区二区三区在线播放| 米奇色色色| 国产十欧洲十美国+亚洲一二三区在线午夜| 婷婷五月精品中文字幕| 亚洲视频欧美| 18禁网站免费观看| 国产综合色婷婷精品久久| 女人的天堂AV| 国产在线观看无码免费视频| 欧美人操逼视频| AV-ThePorn| 久久永久免费精品人妻专区| 一区二区三区电影高清电影免费观看 | 日本狠狠操| 53岁露大奶熟女偷情贴吧| 国产精品日韩| 五月天黄色电影| 九九99精品| 国产剧情91| 日韩精品无码AV| 久久午夜鲁丝| 成人国产精品秘在线看| 日韩免费毛片| 一级无码视频| 欧一美一婬一伦一区二区三区黑人-亚| 热热热热色| 黄色视频在线免费观看高清视频| 婷婷五月天激情小说| 日韩视频精品| 四虎成人无码A片观看| 成人福利视频在线| 久久人妻视频| 操逼网123| 亚州毛片| 在线观看免费无码| 神马午夜视频| 91精品视频在线免费观看| 亚洲AV无码成人精品区东京热 | 偷拍亚洲欧美| 俺去也www俺去也com| 亲孑伦XXXⅹ熟女| 亚洲一本色道中文无码| 日韩黄片| 精品国产91乱码一区二区三区| 人妻天堂| 97无码精品人妻一区二区三区| 翔田千里在线观看| 日本天天色| 精品久久免费| 五月天黄色电影| 777久久| 免费无码一区| 婷婷五月天色色| 日韩99在线| 最近中文字幕中文翻译歌词| 免费成人国产| 亚洲国产高清在线观看视频| 在线二区| 最新国产AV| 91网站免费| 国产一级片网站| 91麻豆精品无码人妻| 日韩黄色片在线观看| 动漫日逼| 国产精品国内自产拍| 成人三区| 久久99免费视频| 韩国无码专区| 日韩日日日| 中文字幕成人在线观看| 日韩精品在线视频观看| 在线免费观看av网站| 五月天亚洲无码| 北条麻妃无码精品AV怎么看| 成人黄色大片| 超碰成人免费| 一级片黄色| 农村一级婬片A片AAA毛片古装| 婷婷久久综合久| 亚洲男人的天堂av| 亚洲AA视频| 久久久久久久久免费视频| 黄片免费无码| 怍爱视频| 国产特級黃色大片| 久久婷婷五月综合| 日韩激情在线| 91三级| 97狠狠| 尤物在线| av在线免费观看网站| 亚洲中文字幕视频在线| 91碰| 亚洲福利免费观看| 日本一级片免费看| 亚洲射射| 欧美日韩三级在线| 亚洲日韩中文字幕无码| A片久久久| 草久美女| 青娱乐AV| 波多野结衣无码在线| 国产suv精品一区二区6| www.91麻豆| 最近2021中文字幕免费| 九色国产在线| A片在线观看免费| 国产亚洲久一区二区三区| 北条麻妃波多波多野结衣| 91丨九色丨老熟女探花| 天天干,夜夜爽| 99无码精品| 日本一区中文字幕| 曰韩一级片| 加勒比久久88| 国产地址| 不卡AV在线播放| 日韩无码高清网站| 成人在线观看网| 亚洲一线在线观看| 天天操免费| 欧美成人一区免费视频| 三级乱伦86丝袜无码| 五月天激情小说| 婷婷五月丁香六月| 亚洲精品影院| 91人人| 欧美日韩毛| 天天综合色| 内射免费看| 国产123区| 麻豆国产视频| 亚洲无码电影网| A片一级片| 国产视频中文字幕| 国产高清无码免费| 大香蕉操逼视频| 日韩欧美中文字幕在线观看| 成人在线视频免费| 黄色亚洲| 男女av在线| 江苏妇搡BBBB搡BBB| 影音先锋成人网| 欧美一区二区在线| 色妹子综合| 爱操AV| 国产午夜激情| 国产精品999| 99免费视频| 成人性生活一级片| 丝袜诱惑AV| aaa在线免费视频| 成人三级AV在线| 日韩成人无| 日本黄色视频官网| 日本欧洲三级| 人妻无码精品久久人妻成人| 欧美色图狠狠操| 乱伦一级黄片| www.色中色| 九九成人精品| 日韩视频二区| 99免费热视频在线| 欧美午夜爱爱| 国产成人精品av在线观看| 天堂资源在线观看| 九七人妻| 人妻体内射精一区二区三区| 美女91视频网站| 天天色色综合| 久射久| 久久午夜夜伦鲁鲁一区二区| 91精品福利| 亚洲成人黄色电影| aa无码视频| 久久91av| 欧美九九九九| 大香蕉尹人在线视频| 日韩无码黄色视频| 日韩视频二区| 操B电影| 青青草原视频在线| 国产无码操逼| 日本精品无码a62v在线| 成人av免费在线观看| 这里都是精品| 日韩三级小说| 色悠悠久久| 奶大丰满一乱一视频一区二区三区在| 欧美专区一区| 亚洲成人AV一区二区| 日韩无码黄色视频| 国产精品九九九九九九| 国产高清无码一区| 高潮免费视频| 97精品视频在线观看| 亚洲日本视频| 国产成人精品三级麻豆| 91视频播放| 高清无码在线免费观看| 91无码成人视频| 91久久性奴调教| AV大片免费看| 亚洲人成人无码.www粉色| 性爱一级片| 69视频免费观看| 国产17c精品视频一二三区| 亚洲精品大片| 成人三级电影| 国产成人AV免费观看| 久久久婷婷五月亚洲国产精品| 日欧视频| 仓井空一区二区三区| 亚洲无码资源| 成人高清无码视频| 日本韩国无码| 国产精品无码无套在线| 人人干人人看| 任你爽在线视频| 日韩二级片| 亚洲热视频在线观看| 亚洲精选一区二区三区| 丁香五月天AV| 最近中文字幕免费MV第一季歌词怀孕 | 996热久久| 无码在线视频播放| 久久久久亚洲AV无码网影音先锋| 亚洲成人二区| 无码精品久久| 亚洲天堂无码在线观看| 亚洲精品三级| 免费看毛片中文字幕| 天天日天天干天天爽| 成人影视在线免费观看| 99福利| 三级片无码在线观看| 日韩无码一级片| H片在线观看| 国产一级性爱视频| 亚洲精品福利视频导航| 欧美亚洲日韩在线观看| 巨爆乳肉感一区二区三区| 青春草在线观看视频| 国产欧美日韩在线| 日本无码久久嗯啊流水| 免费无码国产在线怀| 日韩AV无码一区二区| 久久久久9| 中文字幕在线精品| 亚洲免费观看视频| 国产精品久久久一区二区三区| 在线A片免费观看| 一区二区无码av| 亚洲国产精品成人综合| 在线观看你懂得| 欧美肏屄视频| 亚洲中文字幕日韩在线| 青娱乐无码视频| 欧美老妇操逼视频| 国产综合久久777777麻豆| 亚洲成人av在线| 韩国毛片基地久久| 亚洲黄色视频在线免费观看| 日韩,变态,另类,中文,人妻| 九九香蕉视频| 国产AV一区二区三区精品| 91成人免费视频| 伊人久久大香色综合久久| 福利在线看| 午夜AV电影| 91超碰在线免费观看| 国产精品九九九| 巨爆乳肉感一区二区三区视频| 中文字幕日本| 人妻人人骑| 美女黄片| 日韩欧美在线观看| 天堂视频中文在线| 五月婷视频| 精品1区| 日本不卡一区二区| 自拍无码视频| 大肉大捧视频免费观看| 亚洲黄色视频网站在线观看| 79色色| 性感欧美美女| 嗯啊在线视频| 国产毛片毛片| 草莓视频在线播放| 山东熟妇搡BBBB搡BBBB| 国产一区视频在线| 26uuu国产| 911精品国产一区二区在线| 一级片A片| 人妻三级| 国产亚洲精品午夜福利巨大软件| 亚洲精品一区二区三区新线路| 国产精成人品| 久久久国产精品人人片| 欧美狠狠插| 嫩草视频网站| a国产| 人妻少妇被猛烈进入中文字幕| 美日韩一区| 欧美在线成人视频| 国产又粗又长| 超碰C| 羽月希奶水饱胀在线播放| 三级片在线网站| 欧美日本国产| 东北女人毛多又黑A片| 国产一级a毛一级a毛视频在线网站? | 操逼的网站| 国产香蕉视频免费| 久久色片| 国产精品18禁| 97中文字幕| 黄页网站视频| 在线天堂19| 午夜无码福利| 丁香婷婷久久久综合精品国产| 中文字幕亚洲天堂| 69视频国产| 安徽妇搡BBBB搡BBBB小说| 探花在线播放| 熟女天堂| 国产高清无码免费| 国产精品系列视频| 婷婷毛片| AV一级片| 不卡一二三区| 四季AV之日韩人妻无码| 三级视频网| 夜夜撸| 欧美成人日韩| 91精品久久久久久久久| 国产福利小视频| 超碰91人人操| 国产精品久久久久精| 91乱子伦国产乱子伦!| 日本色情视频网站| 人妻斩り43歳| 久久99热这里只频精品6学生| 久久99精品国产.久久久久| 日韩熟妇无码| 亚洲精品一区二区三| 国产欧美综合视频一区二区在线 | 中文字幕av久久爽爽| 国产精品无码白浆高潮| 牛牛成人在线视频| 久久久久亚洲AV无码网影音先锋| 中文字幕精品无码一区二区| 日本成人视频在线免费播放| 99精品国产热久久91色欲| 99免费在线观看视频| 欧美一级在线观看| 午夜私人福利| 中文字幕天天干| 人人摸人人爱| 韩国gogogo高清在线完整版| wwwxxx18| 国产剧情一区二区av在线观看| 性无码区| 亚洲无码一二三区| 久久久久久久毛片| 色色激情五月天| 污污污www精品国产网站| 西西人体大胆ww4444图片| 人人做人人做人人做,人人做全句下一| 中文字幕一区二区三区四区50岁 | 91视频青青草| 欧美亚洲日韩一区二区| 日朝无码| 国产人妻人伦精品1国产丝袜 | 欧美黄色小视频| 一道本视频在线免费观看| 2019人人操| 国产强伦轩免费视频在线| 色综合社区| 婷婷精品在线| 亚洲秘AV无码一区二区qq群| 久久久激情| 国产美女自拍视频| 六月婷婷在线观看| a免费在线观看| a√天堂中文8| 在线免费观看黄色网址| 美女肏逼| 色色色成人视频| 久久免费视频,久久免费视频 | 性爱一级视频| 国产精品秘久久久久久| 中文亚洲字幕| 欧一美一婬一伦一区二区三区 | 蜜桃av一区二区三区| 德美日三级片在线观看| 国产黄色自拍| 亚洲日韩中文字幕在线|