• Nacos集群搭建


    一、Window下单机搭建.

    1、Nacos官方文档:Nacos 快速开始

    2、Nacos基于Java开发,部署一个Java应用,版本2.1.0,实际开发使用企业版,有完整权限和运维.

    3、Nacos存储配置在数据库中,简历对应的数据库和表结构,对应SQL如下,这里使用mysql存储.

    1. /*
    2. * Copyright 1999-2018 Alibaba Group Holding Ltd.
    3. *
    4. * Licensed under the Apache License, Version 2.0 (the "License");
    5. * you may not use this file except in compliance with the License.
    6. * You may obtain a copy of the License at
    7. *
    8. * http://www.apache.org/licenses/LICENSE-2.0
    9. *
    10. * Unless required by applicable law or agreed to in writing, software
    11. * distributed under the License is distributed on an "AS IS" BASIS,
    12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13. * See the License for the specific language governing permissions and
    14. * limitations under the License.
    15. */
    16. /******************************************/
    17. /* 数据库全名 = nacos_config */
    18. /* 表名称 = config_info */
    19. /******************************************/
    20. CREATE TABLE `config_info` (
    21. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
    22. `data_id` varchar(255) NOT NULL COMMENT 'data_id',
    23. `group_id` varchar(255) DEFAULT NULL,
    24. `content` longtext NOT NULL COMMENT 'content',
    25. `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
    26. `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    27. `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
    28. `src_user` text COMMENT 'source user',
    29. `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
    30. `app_name` varchar(128) DEFAULT NULL,
    31. `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
    32. `c_desc` varchar(256) DEFAULT NULL,
    33. `c_use` varchar(64) DEFAULT NULL,
    34. `effect` varchar(64) DEFAULT NULL,
    35. `type` varchar(64) DEFAULT NULL,
    36. `c_schema` text,
    37. `encrypted_data_key` text NOT NULL COMMENT '秘钥',
    38. PRIMARY KEY (`id`),
    39. UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
    40. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';
    41. /******************************************/
    42. /* 数据库全名 = nacos_config */
    43. /* 表名称 = config_info_aggr */
    44. /******************************************/
    45. CREATE TABLE `config_info_aggr` (
    46. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
    47. `data_id` varchar(255) NOT NULL COMMENT 'data_id',
    48. `group_id` varchar(255) NOT NULL COMMENT 'group_id',
    49. `datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
    50. `content` longtext NOT NULL COMMENT '内容',
    51. `gmt_modified` datetime NOT NULL COMMENT '修改时间',
    52. `app_name` varchar(128) DEFAULT NULL,
    53. `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
    54. PRIMARY KEY (`id`),
    55. UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
    56. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';
    57. /******************************************/
    58. /* 数据库全名 = nacos_config */
    59. /* 表名称 = config_info_beta */
    60. /******************************************/
    61. CREATE TABLE `config_info_beta` (
    62. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
    63. `data_id` varchar(255) NOT NULL COMMENT 'data_id',
    64. `group_id` varchar(128) NOT NULL COMMENT 'group_id',
    65. `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
    66. `content` longtext NOT NULL COMMENT 'content',
    67. `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
    68. `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
    69. `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    70. `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
    71. `src_user` text COMMENT 'source user',
    72. `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
    73. `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
    74. `encrypted_data_key` text NOT NULL COMMENT '秘钥',
    75. PRIMARY KEY (`id`),
    76. UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
    77. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';
    78. /******************************************/
    79. /* 数据库全名 = nacos_config */
    80. /* 表名称 = config_info_tag */
    81. /******************************************/
    82. CREATE TABLE `config_info_tag` (
    83. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
    84. `data_id` varchar(255) NOT NULL COMMENT 'data_id',
    85. `group_id` varchar(128) NOT NULL COMMENT 'group_id',
    86. `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
    87. `tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
    88. `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
    89. `content` longtext NOT NULL COMMENT 'content',
    90. `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
    91. `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    92. `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
    93. `src_user` text COMMENT 'source user',
    94. `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
    95. PRIMARY KEY (`id`),
    96. UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
    97. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';
    98. /******************************************/
    99. /* 数据库全名 = nacos_config */
    100. /* 表名称 = config_tags_relation */
    101. /******************************************/
    102. CREATE TABLE `config_tags_relation` (
    103. `id` bigint(20) NOT NULL COMMENT 'id',
    104. `tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
    105. `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
    106. `data_id` varchar(255) NOT NULL COMMENT 'data_id',
    107. `group_id` varchar(128) NOT NULL COMMENT 'group_id',
    108. `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
    109. `nid` bigint(20) NOT NULL AUTO_INCREMENT,
    110. PRIMARY KEY (`nid`),
    111. UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
    112. KEY `idx_tenant_id` (`tenant_id`)
    113. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';
    114. /******************************************/
    115. /* 数据库全名 = nacos_config */
    116. /* 表名称 = group_capacity */
    117. /******************************************/
    118. CREATE TABLE `group_capacity` (
    119. `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    120. `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
    121. `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
    122. `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
    123. `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
    124. `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
    125. `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
    126. `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
    127. `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    128. `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
    129. PRIMARY KEY (`id`),
    130. UNIQUE KEY `uk_group_id` (`group_id`)
    131. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';
    132. /******************************************/
    133. /* 数据库全名 = nacos_config */
    134. /* 表名称 = his_config_info */
    135. /******************************************/
    136. CREATE TABLE `his_config_info` (
    137. `id` bigint(64) unsigned NOT NULL,
    138. `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    139. `data_id` varchar(255) NOT NULL,
    140. `group_id` varchar(128) NOT NULL,
    141. `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
    142. `content` longtext NOT NULL,
    143. `md5` varchar(32) DEFAULT NULL,
    144. `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
    145. `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
    146. `src_user` text,
    147. `src_ip` varchar(50) DEFAULT NULL,
    148. `op_type` char(10) DEFAULT NULL,
    149. `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
    150. `encrypted_data_key` text NOT NULL COMMENT '秘钥',
    151. PRIMARY KEY (`nid`),
    152. KEY `idx_gmt_create` (`gmt_create`),
    153. KEY `idx_gmt_modified` (`gmt_modified`),
    154. KEY `idx_did` (`data_id`)
    155. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';
    156. /******************************************/
    157. /* 数据库全名 = nacos_config */
    158. /* 表名称 = tenant_capacity */
    159. /******************************************/
    160. CREATE TABLE `tenant_capacity` (
    161. `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    162. `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
    163. `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
    164. `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
    165. `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
    166. `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
    167. `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
    168. `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
    169. `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    170. `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
    171. PRIMARY KEY (`id`),
    172. UNIQUE KEY `uk_tenant_id` (`tenant_id`)
    173. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';
    174. CREATE TABLE `tenant_info` (
    175. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
    176. `kp` varchar(128) NOT NULL COMMENT 'kp',
    177. `tenant_id` varchar(128) default '' COMMENT 'tenant_id',
    178. `tenant_name` varchar(128) default '' COMMENT 'tenant_name',
    179. `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
    180. `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
    181. `gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
    182. `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
    183. PRIMARY KEY (`id`),
    184. UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
    185. KEY `idx_tenant_id` (`tenant_id`)
    186. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';
    187. CREATE TABLE `users` (
    188. `username` varchar(50) NOT NULL PRIMARY KEY,
    189. `password` varchar(500) NOT NULL,
    190. `enabled` boolean NOT NULL
    191. );
    192. CREATE TABLE `roles` (
    193. `username` varchar(50) NOT NULL,
    194. `role` varchar(50) NOT NULL,
    195. UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
    196. );
    197. CREATE TABLE `permissions` (
    198. `role` varchar(50) NOT NULL,
    199. `resource` varchar(255) NOT NULL,
    200. `action` varchar(8) NOT NULL,
    201. UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
    202. );
    203. INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
    204. INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

    4、配置文件修改

    默认端口:8848.

    1. ### Default web context path:
    2. server.servlet.contextPath=/nacos
    3. ### Default web server port:
    4. server.port=7088
    1. spring.datasource.platform=mysql
    2. ### Count of DB:
    3. db.num=1
    4. ### Connect URL of DB:
    5. db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useUnicode=true&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai
    6. db.user.0=数据库账号
    7. db.password.0=数据库密码
    8. ### Connection pool configuration: hikariCP
    9. db.pool.config.connectionTimeout=30000
    10. db.pool.config.validationTimeout=10000
    11. db.pool.config.maximumPoolSize=20
    12. db.pool.config.minimumIdle=2

    5、单机启动命令

    ①、 startup.cmd -m standalone

    ②、直接启动命令修改.

    修改startup.cmd,修改为standalone,默认是以集群启动的.

     6、配置

    ①、默认账号/密码:nacos/nacos

     ②、新增配置

     ③、修改配置、灰度发布.

    支持TEXT、JSON、XML、YAML、HTML、Properties类型的配置文件,文件枚举信息如下:

    1. package com.alibaba.nacos.api.config;
    2. import com.alibaba.nacos.api.utils.StringUtils;
    3. import java.util.HashMap;
    4. import java.util.Map;
    5. /**
    6. * Config data type.
    7. *
    8. * @author liaochuntao
    9. **/
    10. public enum ConfigType {
    11. /**
    12. * config type is "properties".
    13. */
    14. PROPERTIES("properties"),
    15. /**
    16. * config type is "xml".
    17. */
    18. XML("xml"),
    19. /**
    20. * config type is "json".
    21. */
    22. JSON("json"),
    23. /**
    24. * config type is "text".
    25. */
    26. TEXT("text"),
    27. /**
    28. * config type is "html".
    29. */
    30. HTML("html"),
    31. /**
    32. * config type is "yaml".
    33. */
    34. YAML("yaml"),
    35. /**
    36. * not a real type.
    37. */
    38. UNSET("unset");
    39. private final String type;
    40. private static final Map LOCAL_MAP = new HashMap();
    41. static {
    42. for (ConfigType configType : values()) {
    43. LOCAL_MAP.put(configType.getType(), configType);
    44. }
    45. }
    46. ConfigType(String type) {
    47. this.type = type;
    48. }
    49. public String getType() {
    50. return type;
    51. }
    52. public static ConfigType getDefaultType() {
    53. return TEXT;
    54. }
    55. /**
    56. * check input type is valid.
    57. *
    58. * @param type config type
    59. * @return it the type valid
    60. */
    61. public static Boolean isValidType(String type) {
    62. if (StringUtils.isBlank(type)) {
    63. return false;
    64. }
    65. return null != LOCAL_MAP.get(type);
    66. }
    67. }

    文件修改类型枚举.

    1. package com.alibaba.nacos.api.config;
    2. /**
    3. * Property Change Type.
    4. *
    5. * @author rushsky518
    6. */
    7. public enum PropertyChangeType {
    8. /**
    9. * add.
    10. */
    11. ADDED,
    12. /**
    13. * modified.
    14. */
    15. MODIFIED,
    16. /**
    17. * deleted.
    18. */
    19. DELETED
    20. }

    在配置项中设置.

    1. package com.alibaba.nacos.api.config;
    2. /**
    3. * ConfigChangeItem.
    4. *
    5. * @author rushsky518
    6. */
    7. public class ConfigChangeItem {
    8. private String key;
    9. private String oldValue;
    10. private String newValue;
    11. private PropertyChangeType type;
    12. public ConfigChangeItem(String key, String oldValue, String newValue) {
    13. this.key = key;
    14. this.oldValue = oldValue;
    15. this.newValue = newValue;
    16. }
    17. public String getKey() {
    18. return key;
    19. }
    20. public void setKey(String key) {
    21. this.key = key;
    22. }
    23. public String getOldValue() {
    24. return oldValue;
    25. }
    26. public void setOldValue(String oldValue) {
    27. this.oldValue = oldValue;
    28. }
    29. public String getNewValue() {
    30. return newValue;
    31. }
    32. public void setNewValue(String newValue) {
    33. this.newValue = newValue;
    34. }
    35. public PropertyChangeType getType() {
    36. return type;
    37. }
    38. public void setType(PropertyChangeType type) {
    39. this.type = type;
    40. }
    41. @Override
    42. public String toString() {
    43. return "ConfigChangeItem{" + "key='" + key + '\'' + ", oldValue='" + oldValue + '\'' + ", newValue='" + newValue
    44. + '\'' + ", type=" + type + '}';
    45. }
    46. }

     ④、配置项查询,content为longtext类型存储.

    ⑤、配置项修改

     

    启动失败时候查看日志解决具体报错,使用logback日志组件.

     

    二、Windows下集群搭建

    1、目录规划以及端口安排,三个节点集群搭建.

    Nacos1:8848

    Nacos2:8850

    Nacos3:8852

    注意:单个Nacos节点分布式搭建集群需要四个端口.

    1. raft port: ${server.port} - 1000
    2. grpc port: ${server.port} + 1000
    3. grpc port for server: ${server.port} + 1001

    例如:假设对外端口为8848,即总共会有4个端口被占用,分别为7848、8848、9848、9849

    集群搭建要避免端口占用,否则集群启动节点失败.

    netstat -ano |findstr "8848"

    8848、7848、9848、9849

    netstat -ano |findstr "8850" 

    8850、7850、9850、9851

    netstat -ano |findstr "8852" 

    8852、7852、9852、9853

    2、集群配置文件

    8848节点,配置各个节点的集群ServerIP

    1. 192.168.1.6:8848
    2. 192.168.1.6:8850
    3. 192.168.1.6:8852

     3、启动集群节点

    8848节点

    8850节点

     8852节点

     4、集群访问页面

    http://192.168.1.6:8848/nacos/index.html#/clusterManagement?dataId=&group=&appName=&namespace=

     账号:nacos/nacos

    节点元数据.

     

     5、新增配置

    查看其他两个节点.

    说明:会在文件中做个缓存,本地文件中没有在GET服务端,都是这样设计的,Apollo的也是这样缓存的.

    三、高可用集群

    图片来自网络架构图

     说明:Nginx集群可以用云服务SLB来搭建负载均衡监听,MySQL保证高可用,常见基本如单Region单AZ的主备,以及跨AZ容灾的主备浮动VIP确保.

    ①、Nginx的反向代理配置如下:

    1. http {
    2. server {
    3. listen 80;
    4. server_name 127.0.0.1;
    5. location /nacos {
    6. proxy_pass http://nacoscluster/nacos;
    7. }
    8. }
    9. upstream nacoscluster {
    10. server 192.168.1.6:8848;
    11. server 192.168.1.6:8850;
    12. server 192.168.1.6:8852;
    13. }
    14. }

    这里Nginx配置就略过了,网上资料比较多,配置反向代理即可.

    ②、有条件可以使用云服务+单独域名来负载均衡,搭建高可用的配置服务.

    四、Prometheus监控

    1、本质Nacos是使用SpringBoot开发,自带监控端点actuator,并且集成了prometheus监控.

    2、开启监控项

    management.endpoints.web.exposure.include=*

     3、配置Prometheus监控任务.

    1. # Nacos集群
    2. - job_name: "NacosClusterMonitor"
    3. metrics_path: '/nacos/actuator/prometheus'
    4. static_configs:
    5. - targets: ['192.168.1.6:8848','192.168.1.6:8850','192.168.1.6:8852']

    4、启动Promethesu监控

    http://192.168.1.6:9090/targets#pool-NacosClusterMonitor

    5、Grafana展示

    13221

      

    Nacos的监控实现:使用promethesu+Http方式

    1. package com.alibaba.nacos.client.monitor;
    2. import io.prometheus.client.Gauge;
    3. import io.prometheus.client.Histogram;
    4. /**
    5. * Metrics Monitor.
    6. *
    7. * @author Nacos
    8. */
    9. public class MetricsMonitor {
    10. private static final Gauge NACOS_MONITOR = Gauge.build().name("nacos_monitor").labelNames("module", "name")
    11. .help("nacos_monitor").register();
    12. private static final Histogram NACOS_CLIENT_REQUEST_HISTOGRAM = Histogram.build()
    13. .labelNames("module", "method", "url", "code").name("nacos_client_request").help("nacos_client_request")
    14. .register();
    15. public static Gauge.Child getServiceInfoMapSizeMonitor() {
    16. return NACOS_MONITOR.labels("naming", "serviceInfoMapSize");
    17. }
    18. public static Gauge.Child getDom2BeatSizeMonitor() {
    19. return NACOS_MONITOR.labels("naming", "dom2BeatSize");
    20. }
    21. public static Gauge.Child getListenConfigCountMonitor() {
    22. return NACOS_MONITOR.labels("naming", "listenConfigCount");
    23. }
    24. public static Histogram.Timer getConfigRequestMonitor(String method, String url, String code) {
    25. return NACOS_CLIENT_REQUEST_HISTOGRAM.labels("config", method, url, code).startTimer();
    26. }
    27. public static Histogram.Child getNamingRequestMonitor(String method, String url, String code) {
    28. return NACOS_CLIENT_REQUEST_HISTOGRAM.labels("naming", method, url, code);
    29. }
    30. }
    1. /*
    2. * Copyright 1999-2018 Alibaba Group Holding Ltd.
    3. *
    4. * Licensed under the Apache License, Version 2.0 (the "License");
    5. * you may not use this file except in compliance with the License.
    6. * You may obtain a copy of the License at
    7. *
    8. * http://www.apache.org/licenses/LICENSE-2.0
    9. *
    10. * Unless required by applicable law or agreed to in writing, software
    11. * distributed under the License is distributed on an "AS IS" BASIS,
    12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13. * See the License for the specific language governing permissions and
    14. * limitations under the License.
    15. */
    16. package com.alibaba.nacos.client.config.http;
    17. import com.alibaba.nacos.api.exception.NacosException;
    18. import com.alibaba.nacos.client.monitor.MetricsMonitor;
    19. import com.alibaba.nacos.common.http.HttpRestResult;
    20. import io.prometheus.client.Histogram;
    21. import java.util.Map;
    22. /**
    23. * MetricsHttpAgent.
    24. *
    25. * @author Nacos
    26. */
    27. public class MetricsHttpAgent implements HttpAgent {
    28. private static final String GET = "GET";
    29. private static final String POST = "POST";
    30. private static final String DELETE = "DELETE";
    31. private static final String DEFAULT_CODE = "NA";
    32. private final HttpAgent httpAgent;
    33. public MetricsHttpAgent(HttpAgent httpAgent) {
    34. this.httpAgent = httpAgent;
    35. }
    36. @Override
    37. public void start() throws NacosException {
    38. httpAgent.start();
    39. }
    40. @Override
    41. public HttpRestResult httpGet(String path, Map headers, Map paramValues,
    42. String encode, long readTimeoutMs) throws Exception {
    43. Histogram.Timer timer = MetricsMonitor.getConfigRequestMonitor(GET, path, DEFAULT_CODE);
    44. HttpRestResult result;
    45. try {
    46. result = httpAgent.httpGet(path, headers, paramValues, encode, readTimeoutMs);
    47. } finally {
    48. timer.observeDuration();
    49. }
    50. return result;
    51. }
    52. @Override
    53. public HttpRestResult httpPost(String path, Map headers, Map paramValues,
    54. String encode, long readTimeoutMs) throws Exception {
    55. Histogram.Timer timer = MetricsMonitor.getConfigRequestMonitor(POST, path, DEFAULT_CODE);
    56. HttpRestResult result;
    57. try {
    58. result = httpAgent.httpPost(path, headers, paramValues, encode, readTimeoutMs);
    59. } finally {
    60. timer.observeDuration();
    61. }
    62. return result;
    63. }
    64. @Override
    65. public HttpRestResult httpDelete(String path, Map headers, Map paramValues,
    66. String encode, long readTimeoutMs) throws Exception {
    67. Histogram.Timer timer = MetricsMonitor.getConfigRequestMonitor(DELETE, path, DEFAULT_CODE);
    68. HttpRestResult result;
    69. try {
    70. result = httpAgent.httpDelete(path, headers, paramValues, encode, readTimeoutMs);
    71. } finally {
    72. timer.observeDuration();
    73. }
    74. return result;
    75. }
    76. @Override
    77. public String getName() {
    78. return httpAgent.getName();
    79. }
    80. @Override
    81. public String getNamespace() {
    82. return httpAgent.getNamespace();
    83. }
    84. @Override
    85. public String getTenant() {
    86. return httpAgent.getTenant();
    87. }
    88. @Override
    89. public String getEncode() {
    90. return httpAgent.getEncode();
    91. }
    92. @Override
    93. public void shutdown() throws NacosException {
    94. httpAgent.shutdown();
    95. }
    96. }

    仅仅搭建,后面分析分布式算法和一些源码等.

  • 相关阅读:
    保姆级Ubuntu从下载到正常使用,遇到各种问题解决方案。
    华为数通方向HCIP-DataCom H12-821题库(多选题:41-60)
    文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于相似日聚类及模态分解的短期光伏发电功率组合预测研究》
    Google开源依赖注入框架-Guice指南
    基于神经网络的偏微分方程求解器再度取得突破,北大&字节的研究成果入选Nature子刊
    【SDXL_LORA模型训练详细教程(含云端教程)】
    Python时间模块(datetime)
    前端基础建设与架构14 解析 Webpack 源码,实现自己的构建工具
    shell_41.Linux获取所有的数据
    ASUS华硕天选4笔记本FA507NU7735H_4050原装出厂Win11系统
  • 原文地址:https://blog.csdn.net/HcJsJqJSSM/article/details/126913792