2020年7月7日星期二

配置中心预研

配置中心预研

概述

随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关、参数的配置、服务器的地址……

对程序配置的期望值也越来越高:配置修改后实时生效,分环境、分集群管理配置,代码安全、审核机制……

在这样的大环境下,传统的通过配置文件、数据库等方式已经越来越无法满足开发人员对配置管理的需求。

所以,配置中心应运而生。

选型思路

1、询问几个道友(多询问几个不同的群的道友,防止人云亦云)

2、百度大范围搜大致的看 选中几个使用广、文档多的

3、github对比issues、pull requests、insights、commits、branches、tags

4、语言对比、性能对比(通过CNCF对比)

询问道友

大致得出的可选组件为:apollo nacos eureka zk consul

百度大范围搜索

名词解释

CAP理论:CAP理论是分布式架构中重要理论

    • 一致性(Consistency) (所有节点在同一时间具有相同的数据)
    • 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
    • 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)

CAP 不可能都取,只能取其中2个

原因是

如果C是第一需求的话,那么会影响A的性能,因为要数据同步,不然请求结果会有差异,但是数据同步会消耗时间,期间可用性就会降低。

如果A是第一需求,那么只要有一个服务在,就能正常接受请求,但是对与返回结果变不能保证,原因是,在分布式部署的时候,数据一致的过程不可能想切线路那么快。

再如果,同时满足一致性和可用性,那么分区容错就很难保证了,也就是单点,也是分布式的基本核心,好了,明白这些理论,就可以在相应的场景选取服务注册与发现了。

服务注册中心解决方案

设计或者选型一个服务注册中心,首先要考虑的就是服务注册与发现机制。纵观当下各种主流的服务注册中心解决方案,大致可归为三类:

应用内:直接集成到应用中,依赖于应用自身完成服务的注册与发现

应用外:把应用当成黑盒,通过应用外的某种机制将服务注册到注册中心,最小化对应用的侵入性

DNS:将服务注册为DNS的SRV记录,严格来说,是一种特殊的应用外注册方式

Dubbo

https://baike.baidu.com/item/Dubbo/18907815?fr=aladdin

gitlab对比

nacos

apollo

consul

总结

对比项目NacosApolloEurekaZookeeperConsul
一致性CP+APCP+APAPCPCP
github活跃度活跃不活跃快凉不活跃活跃
健康检查TCP/HTTP/MYSQL/Client BeatHTTPClient BeatKeep AliveTCP/HTTP/gRPC/Cmd
负载均衡策略权重/metadata/SelectorRibbonRibbon-Fabio
雪崩保护
自动注销实例支持支持支持支持不支持
访问协议HTTP/DNSHTTPHTTPTCPHTTP/DNS
监听支持支持支持支持支持支持
多数据中心支持支持支持不支持支持
跨注册中心同步支持支持不支持不支持不支持
Dubbo集成支持支持不支持支持不支持
k8s集成支持较困难不支持不支持支持
语言JAVAJAVAJAVAJAVAGO
图形界面间接直观细节繁琐仅供展示

通过表格化对比,综合各方面考虑,推荐的配置中心为:Nacos,理由:1、支持k8s集成 2、操作简单 3、符合公司需求要求、4、功能支持多

部署

公司内网服务器做部署测试机

按照省钱省事原则,选择在单节点上部署mysql pod、nacos pod

按照约定每个应用在我司k8s环境中单属于一个名称空间

配置名称空间

# cat nacos.yaml apiVersion: v1kind: Namespacemetadata: name: nacos

配置mysql服务

# cat mysql_deployment.yaml apiVersion: apps/v1kind: Deploymentmetadata: name: mysql namespace: nacos labels: name: mysqlspec: replicas: 1 selector: matchLabels:  name: mysql template: metadata:  labels:  name: mysql spec:  containers:  - name: mysql   image: nacos/nacos-mysql:5.7   ports:   - containerPort: 3306   volumeMounts:   - name: mysql-data    mountPath: /var/lib/mysql   env:   - name: MYSQL_ROOT_PASSWORD    value: "root"   - name: MYSQL_DATABASE    value: "nacos"   - name: MYSQL_USER    value: "nacos"   - name: MYSQL_PASSWORD    value: "nacos"  volumes:  - name: mysql-data   hostPath:   path: /data/nacos

创建mysql svc 提供nacos 连接

# cat mysql_svc.yaml apiVersion: v1kind: Servicemetadata: name: mysql namespace: nacos labels: name: mysqlspec: ports: - port: 3306  targetPort: 3306 selector: name: mysql

配置nacos服务

# cat nacos_statefulset.yaml apiVersion: v1kind: ConfigMapmetadata: name: nacos-cm namespace: nacosdata: mysql.db.host: "mysql.nacos.svc.cluster.local" # 添加 mysql pod 访问地址 mysql.db.name: "nacos" mysql.port: "3306" mysql.user: "nacos" mysql.password: "nacos"---apiVersion: apps/v1kind: StatefulSetmetadata: name: nacos namespace: nacosspec: selector: matchLabels:  app: nacos serviceName: nacos replicas: 1 template: metadata:  labels:  app: nacos  annotations:  pod.alpha.kubernetes.io/initialized: "true" spec:  containers:  - name: nacos   imagePullPolicy: Always   image: nacos/nacos-server:latest   resources:   requests:    memory: "2Gi"    cpu: "500m"   ports:   - containerPort: 8848    name: client   env:   - name: NACOS_REPLICAS    value: "1"   - name: MYSQL_SERVICE_DB_NAME    valueFrom:    configMapKeyRef:     name: nacos-cm     key: mysql.db.name   - name: MYSQL_SERVICE_HOST # 添加 mysql 访问地址的环境变量    valueFrom:    configMapKeyRef:     name: nacos-cm     key: mysql.db.host   - name: MYSQL_SERVICE_PORT    valueFrom:    configMapKeyRef:     name: nacos-cm     key: mysql.port   - name: MYSQL_SERVICE_USER    valueFrom:    configMapKeyRef:     name: nacos-cm     key: mysql.user   - name: MYSQL_SERVICE_PASSWORD    valueFrom:    configMapKeyRef:     name: nacos-cm     key: mysql.password   - name: NACOS_SERVER_PORT    value: "8848"   - name: PREFER_HOST_MODE    value: "hostname"   - name: NACOS_SERVERS    value: "nacos-0.nacos.nacos.svc.cluster.local:8848"

创建nacos svc 代理pod

# cat nacos_svc.yaml apiVersion: v1kind: Servicemetadata: name: nacos namespace: nacos labels: app: nacos annotations: service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"spec: ports: - port: 8848  name: server  targetPort: 8848 clusterIP: None selector: app: nacos

创建Ingress暴露服务,供内部访问

# cat nacos_ingress.yaml apiVersion: extensions/v1beta1kind: Ingressmetadata: name: nacos namespace: nacosspec: rules: - host: nacos.linux.com  http:  paths:   - backend:    serviceName: nacos    servicePort: 8848

查看nacos 配置中心有关应用状态

# kubectl get pods,svc,ingress -n nacosNAME       READY STATUS RESTARTS AGEpod/mysql-5bbd5954cc-g4k9k 1/1  Running 0   70mpod/nacos-0     1/1  Running 0   29mNAME   TYPE  CLUSTER-IP  EXTERNAL-IP PORT(S) AGEservice/mysql ClusterIP 10.43.105.239 <none>  3306/TCP 54mservice/nacos ClusterIP None   <none>  8848/TCP 38mNAME      HOSTS    ADDRESS  PORTS AGEingress.extensions/nacos nacos.linux.com 10.17.1.44 80  37m

似乎是没得问题

本地hosts解析

访问

nacos.linux.com

emmmmmm 404 路径错误, 怎么搞

查看日志

# kubectl logs -f nacos-0 -n nacos......Console: src="https://img2020.cnblogs.com/blog/1464583/202007/1464583-20200707154642766-1858456558.png" alt="" loading="lazy">

然后就...... 随便点点看看熟悉熟悉吧

配置中心预研e票联square启明星软件一个网红蜂箱,如何爆卖全球?Facebook社交广告如何蚕食Google搜索广告市场?亚马逊运营QA集锦(814-823)珠海长隆报团多少钱珠海长隆报团多少钱珠海长隆报团旅游多少钱

没有评论:

发表评论