39.SpringCloud—配置管理nacos、远程调用Feign、服务网关Gateway

news2024/11/8 15:33:21

目录

一、SpringCloud。

(1)Nacos配置管理。

(1.1)统一配置管理。

(1.2)配置热更新(自动更新,不需要重启服务)。

(1.3)多环境配置共享。

(1.4)多服务共享配置。

(2)http客户端Feign。

(2.1)RestTemplate方式调用存在的问题。

(2.2)Feign-快速入门。

(2.3)自定义Feign的配置——日志配置。

(2.4)Feign的性能优化。

(2.5)Feign的最佳实践。

(2.6)实现—Feign的最佳实践_方式二。

(3)网关Gateway。

(3.1)网关的作用。

(3.2)搭建网关服务。

(3.3)路由断言工厂。

(3.4)Gateway过滤器工厂。

(3.5)全局过滤器(需要自己编写)。

(3.6)过滤器执行顺序。

(3.7)跨域问题处理。

(3.8)限流过滤器(仅供参考)。

二、搭建Nacos集群。 

(1)搭建集群的基本步骤:

(2)搭建数据库,初始化数据库表结构。

(2)下载nacos安装包。

(3) 配置nacos。

(3.1)修改cluster.conf文件。

(3.2) 修改application.properties文件。

(3.3)复制三个nacos,并修改三个nacos的端口。

(4)启动nacos。

(5)nginx反向代理。

(6)访问nacos服务端。


一、SpringCloud。

(1)Nacos配置管理。

(1.1)统一配置管理。

注意:如果nacos中的文件写在public之外的命名空间,则在bootstrap文件要在config下写上namespace(命名空间),不然报错或读取为null(因为默认是public命名空间)。 

提示:下面写的dev指的是开发环境使用的配置,而不是dev命名空间。(该服务只能读取它的命名空间下的多环境配置,不可跨越namespace读取

spring:
  application:
    name: userservice
  profiles:
    active: dev # 环境
  cloud:
    nacos:
#      server-addr: localhost:8848 # nacos地址可以写在这里,也可以写在config那里
#      namespace: 638a9517-13dd-4e8a-921a-59db18ab1368 # *****不能在这写,会报错报错报错报错报错报错
      config:  # 推荐写到config下面
        server-addr: localhost:8848
        namespace: 638a9517-13dd-4e8a-921a-59db18ab1368 # 这里一定是这样写,不然一直报错(解析不了注入的属性名等等问题)
        file-extension: yaml # 文件后缀名

(1.2)配置热更新(自动更新,不需要重启服务)。

有两种方式:

第一种方式:

@RefreshScope注解+@Value("${pattern.dateformat}")注解(获取配置文件属性值)

第二种方式:

@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
}

(1.3)多环境配置共享。

注意:nacos中的多环境配置文件命名空间与服务的命名空间要一致。 

优先级:[服务名]-[环境].yaml >[服务名].yaml > 本地配置

(1.4)多服务共享配置。

提示:看最后四行就行,最后四行是多服务共享配置的两种方式。 

spring:
  application:
    name: userservice
  profiles:
    active: dev # 环境
  cloud:
    nacos:
#      server-addr: localhost:8848 # nacos地址可以写在这里,也可以写在config那里
#      namespace: 638a9517-13dd-4e8a-921a-59db18ab1368 # *****不能在这写,会报错报错报错报错报错报错
      config:  # 推荐写到config下面
        server-addr: localhost:8848
#        namespace: 638a9517-13dd-4e8a-921a-59db18ab1368 # 这里一定是这样写,不然一直报错(解析不了注入的属性名等等问题)
        file-extension: yaml # 文件后缀名
        extension-configs:
          - dataId: orderservice.yaml
#        shared-configs:
#          - dataId: orderservice.yaml

 第一种方式:在config下添加。

shared-configs:
  - dataId: orderservice.yaml

第二种方式:在config下添加。

extension-configs:
  - dataId: orderservice.yaml

(2)http客户端Feign。

(2.1)RestTemplate方式调用存在的问题。

(2.2)Feign-快速入门。

1、导入依赖。 

<!--feign客户端依赖包-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2、开启Feign。 

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

 3、编写Feign客户端。

@FeignClient("userservice")
public interface UserClient {
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

(2.3)自定义Feign的配置——日志配置。

第二种方式—局部配置(代码配置):

@FeignClient(value = "userservice",configuration = DefaultFeignConfiguration.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

(2.4)Feign的性能优化。

<!--引入HttpClient依赖-->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>
        <dependency>
feign:
  httpclient:
    enabled: true # 支持HttpClient的开关
    max-connections: 200 # 最大连接数
    max-connections-per-route: 50 # 单个路径的最大连接数

(2.5)Feign的最佳实践。

(2.6)实现—Feign的最佳实践_方式二。

feign-api模块中: 

//@FeignClient(value = "userservice",configuration = DefaultFeignConfiguration.class)
@FeignClient(value = "userservice")
public interface UserClient {
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}
public class DefaultFeignConfiguration {
    @Bean
    public Logger.Level logLevel(){
        return Logger.Level.BASIC;
    }
}
@Data
public class User {
    private Long id;
    private String username;
    private String address;
}

 在需要使用Feign的微服务pom中: 

<!--引入feign的统一api,这个模块是自己写的-->
        <dependency>
            <groupId>cn.itcast.demo</groupId>
            <artifactId>feign-api</artifactId>
            <version>1.0</version>
        </dependency>

作用:引入这个依赖后,可以使用这个模块的类。 


(3)网关Gateway。

(3.1)网关的作用。

(3.2)搭建网关服务。

1、这里的网关也是一个微服务(新模块),在pom中导入依赖:

    <dependencies>
        <!--nacos服务注册发现依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--网关gateway依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
    </dependencies>

2、在application.yaml配置文件中配置:

注意:请求进入网关的时候:先predicates(断言,如果满足)—> uri(去nacos获取服务地址)

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:80
    gateway:
      routes:
        - id: user-service #路由标识
          uri: lb://userservice #路由的目标地址
          predicates: #路由断言,判断请求是否符合规则
            - Path=/user/** #路径断言,判断路径是否是以/user开头,如果是则符合规则(发到uri: lb://userservice中去)
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**

(3.3)路由断言工厂。

注意:断言工厂根据需求,到spring官方网站查找,有具体语法。

提示:比如下面的,要满足predicates中的Path与Before才能算是符合条件,然后路由到uri地址。 

- id: order-service
  uri: lb://orderservice
  predicates:
    - Path=/order/**
    - Before=2031-01-20T17:42:47.789-07:00[America/Denver]

(3.4)Gateway过滤器工厂。

注意:过滤器工厂有37种,根据需求到spring官方网站查找使用,有具体使用语法。

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:80
    gateway:
      routes:
        - id: user-service #路由标识
          uri: lb://userservice #路由的目标地址
          predicates: #路由断言,判断请求是否符合规则
            - Path=/user/** #路径断言,判断路径是否是以/user开头,如果是则符合规则(发到uri: lb://userservice中去)
#          filters:
#            - AddRequestHeader=Truth,Itcast is freaking aowsome!
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**
            - Before=2031-01-20T17:42:47.789-07:00[America/Denver]
      default-filters:
        - AddRequestHeader=Truth,Itcast is freaking aowsome!

(3.5)全局过滤器(需要自己编写)。

//@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //1.获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        //2.获取参数中的authorization参数
        MultiValueMap<String, String> params = request.getQueryParams();
        //3.判断参数值是否等于 admin
        String authorization = params.getFirst("authorization");
        if ("admin".equals(authorization)){
            //4.相等,放行
            return chain.filter(exchange);
        }
        //5.不相等,拦截
        //5.1设置状态码
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        //5.2拦截请求
        return exchange.getResponse().setComplete();
    }

    @Override
    public int getOrder() {
        return -1;
    }
}

(3.6)过滤器执行顺序。

注意:

1、网关断言成功后过滤器才开始合并成一个过滤器链。

2、路由过滤器与DefaultFilter都是各自从1开始计数(因为这两种都可以有很多个)。

3、全局过滤器自己定义大小(默认顺序是非常非常后面的)


(3.7)跨域问题处理。

跨域:就是在一个网页中,请求跟它的IP地址或端口不一样的资源。

如果HTML文件所在的源为A,而请求数据的目标源为B,由B服务器返回的响应数据如果包含Access-Control-Allow-Origin头,其中值为A,那么浏览器就认为这是一次合法的跨域请求,会允许响应数据返回给A客户端。但如果没有这个头或者值不是A,则会被浏览器拦截,导致跨域问题。

spring:
  cloud:
    gateway:
      globalcors: # 全局的跨域处理
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        corsConfigurations:
          '[/**]':
            allowedOrigins: # 允许哪些网站的跨域请求
              - "http://localhost:8090"
              - "http://www.leyou.com"
            allowedMethods: # 允许的跨域ajax的请求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders: "*" # 允许在请求中携带的头信息
            allowCredentials: true # 是否允许携带cookie
            maxAge: 360000 # 这次跨域检测的有效期

(3.8)限流过滤器(仅供参考)。

二、搭建Nacos集群。 

(1)搭建集群的基本步骤:

  • 搭建数据库,初始化数据库表结构
  • 下载nacos安装包
  • 配置nacos
  • 启动nacos集群
  • nginx反向代理

(2)搭建数据库,初始化数据库表结构。

作用:Nacos 集群可以选择使用数据库来存储服务和配置信息,其主要目的是提高数据的可靠性和持久化能力。

为什么使用数据库:

Nacos默认数据存储在内嵌数据库Derby中,不属于生产可用的数据库。(Nacos中默认使用的嵌入式数据库 Derby,虽然它可以满足基本使用需求,但在生产环境中不建议使用,因为它并不具备高可用性和可靠性等方面的优势,不能保证在重要数据丢失时能够快速恢复。)


首先新建一个数据库,命名为nacos,而后导入下面的SQL:

CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(255) DEFAULT NULL,
  `content` longtext NOT NULL COMMENT 'content',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';
/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_aggr   */
/******************************************/
CREATE TABLE `config_info_aggr` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(255) NOT NULL COMMENT 'group_id',
  `datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
  `content` longtext NOT NULL COMMENT '内容',
  `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';
/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_beta   */
/******************************************/
CREATE TABLE `config_info_beta` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL COMMENT 'content',
  `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';
/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_tag   */
/******************************************/
CREATE TABLE `config_info_tag` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  `tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL COMMENT 'content',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';
/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_tags_relation   */
/******************************************/
CREATE TABLE `config_tags_relation` (
  `id` bigint(20) NOT NULL COMMENT 'id',
  `tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
  `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`nid`),
  UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
  KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';
/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = group_capacity   */
/******************************************/
CREATE TABLE `group_capacity` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
  `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
  `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';
/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = his_config_info   */
/******************************************/
CREATE TABLE `his_config_info` (
  `id` bigint(64) unsigned NOT NULL,
  `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `src_user` text,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`nid`),
  KEY `idx_gmt_create` (`gmt_create`),
  KEY `idx_gmt_modified` (`gmt_modified`),
  KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';
/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = tenant_capacity   */
/******************************************/
CREATE TABLE `tenant_capacity` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
  `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
  `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';
CREATE TABLE `tenant_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `kp` varchar(128) NOT NULL COMMENT 'kp',
  `tenant_id` varchar(128) default '' COMMENT 'tenant_id',
  `tenant_name` varchar(128) default '' COMMENT 'tenant_name',
  `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
  `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
  `gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
  `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
  KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';
CREATE TABLE `users` (
	`username` varchar(50) NOT NULL PRIMARY KEY,
	`password` varchar(500) NOT NULL,
	`enabled` boolean NOT NULL
);
CREATE TABLE `roles` (
	`username` varchar(50) NOT NULL,
	`role` varchar(50) NOT NULL,
	UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);
CREATE TABLE `permissions` (
    `role` varchar(50) NOT NULL,
    `resource` varchar(255) NOT NULL,
    `action` varchar(8) NOT NULL,
    UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);
INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

(2)下载nacos安装包。

nacos在GitHub上有下载地址:https://github.com/alibaba/nacos/tags,可以选择任意版本下载。

(3) 配置nacos。

(3.1)修改cluster.conf文件

nacos/conf/cluster.conf.example 文件是一个示例集群配置文件,它包含了在 Nacos 集群中至少需要三个节点的 IP 地址和端口等信息。具体来说,cluster.conf.example 文件中每行的格式为:

nodeIp:port

其中 nodeIp 为节点的 IP 地址,port 为节点监听的端口号。

cluster.conf.example 文件的作用是提供一份集群配置的范例,方便用户进行参考和修改。当需要将 Nacos 部署成集群模式时,用户可以通过修改该文件来配置集群中各节点的地址和端口号。此外,用户还可以根据实际需求增加或删除集群节点的信息。

需要注意的是,cluster.conf.example 文件需要重命名为 cluster.conf 才能生效。重命名后,Nacos 会自动读取该文件的配置信息并将节点加入到集群中。


1、进入nacos的conf目录,修改配置文件cluster.conf.example,重命名为cluster.conf。

然后添加内容(在cluster.conf下面添加上,把原本的地址删掉):按照nacos结点的地址添加。

127.0.0.1:8845
127.0.0.1.8846
127.0.0.1.8847

作用解析: 

通过在 Nacos 的 conf 目录下创建 cluster.conf 文件,并在其中添加节点的 IP 地址和端口信息,可以使不同的 Nacos 节点之间进行数据同步和协调,从而实现高可用性和负载均衡。

具体来讲,在 Nacos 集群中,每个节点都会读取 cluster.conf 文件,并尝试连接其中列出的其它节点。如果节点之间能够成功建立连接,它们就会使用 Raft 协议进行数据同步和状态机复制,并按照一定的算法选举 leader 节点,从而实现数据的高可用性和一致性。

例如,当一个客户端向 Nacos 集群中的某个节点发起注册服务的请求时,该节点会将请求转发给 leader 节点处理,并等待 leader 节点返回响应。如果 leader 节点出现故障,集群中的其它节点会重新进行 leader 选举,以选出新的 leader 节点,并确保服务的继续注册和发现。

因此,通过在 cluster.conf 中配置节点信息,我们可以实现多节点之间的数据同步和状态机复制,从而提供高可用性和负载均衡的服务。这也是在分布式系统中常见的一种数据复制和高可用性实现方式。

(3.2) 修改application.properties文件。

添加数据库配置:

注意:这里面的配置都有,只需删除注释标识符就行,然后根据实际情况修改。 

spring.datasource.platform=mysql

db.num=1

db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123

(3.3)复制三个nacos,并修改三个nacos的端口。

注意:是把完成了上面(3.1)(3.2)操作的nacos复制三个。

将nacos文件夹复制三份,分别命名为:nacos1、nacos2、nacos3。

然后分别修改三个文件夹中的application.properties:

nacos1:

server.port=8845

nacos2:

server.port=8846

nacos3:

server.port=8847

(4)启动nacos。

然后分别启动三个nacos节点:

startup.cmd

注意: nacos集群启动和单体启动是不一样的,单体nacos启动需要添加参数。

(5)nginx反向代理。

1、下载nginx,解压到任意非中文目录下。

2、修改conf/nginx.conf文件,配置如下:

注意:复制到http语句块的任意位置都可以,但一定要在http语句块内。

upstream nacos-cluster {
    server 127.0.0.1:8845;
	server 127.0.0.1:8846;
	server 127.0.0.1:8847;
}

server {
    listen       80;
    server_name  localhost;

    location /nacos {
        proxy_pass http://nacos-cluster;
    }
}

3、进入cmd,启动nginx.exe程序。

start nginx.exe 

(6)访问nacos服务端。

在浏览器访问:http://localhost/nacos即可。

在微服务的application.yml文件中的配置如下:

spring:
  cloud:
    nacos:
      server-addr: localhost:80 # Nacos地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/671979.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++篇】初识C++

友情链接&#xff1a;C/C系列系统学习目录 知识点内容正确性以C Primer&#xff08;中文版第五版&#xff09;、C Primer Plus&#xff08;中文版第六版&#xff09;为标准&#xff0c;同时参考其它各类书籍、优质文章等&#xff0c;总结归纳出个人认为较有逻辑的整体框架&…

E. Tracking Segments - 二分+前缀和

分析&#xff1a; 记录所有区间和给定的每一次的询问&#xff0c;二分询问的最小满足条件&#xff0c;可以通过前缀和来计算区间内有几个1。 代码&#xff1a; #include <bits/stdc.h>#define x first #define y secondusing namespace std;typedef long long ll; type…

​面试官疯了:while(true)和for(;;)哪个性能好?

△Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 427 篇原创分享 作者 l Hollis 来源 l Hollis&#xff08;ID&#xff1a;hollischuang&#xff09; while(true)和for(;;)都是做无限循环的代码&#xff0c;他俩有啥区别呢&#xff1f; 我承认这个问题有点无聊&#…

四、Docker镜像

学习参考&#xff1a;尚硅谷Docker实战教程、Docker官网、其他优秀博客(参考过的在文章最后列出) 目录 前言一、Docker镜像1.1 概念1.2 UnionFS&#xff08;联合文件系统&#xff09;1.3 Docker镜像加载原理1.4 重点理解 二、docker commit 命令2.1 是什么&#xff1f;2.2 命令…

走进人工智能|机器学习 解码未来的科技革命

前言: 机器学习的发展为我们提供了更智能、高效和便捷的科技产品和服务&#xff0c;可以改善我们的生活和工作方式。 文章目录 序言背景解码未来的科技革命技术支持应用领域程序员如何学总结 序言 机器学习是一种人工智能领域的技术&#xff0c;它让计算机通过数据自动地学习和…

folium离线地图使用

几点说明&#xff1a; 1. 代码亲测有效&#xff08;效果见文末图&#xff09; 2. 离线使用&#xff0c;需要预先下载png格式的离线地图&#xff0c;这里以OpenStreetMap为例。 3. 离线地图下载工具&#xff1a;Offline Map Maker https://www.allmapsoft.com/omm/ 4. foliu…

赋予女性力量:在 Web3 和元宇宙中释放新的机会

Web3 和元宇宙的出现引发了数字领域的革命&#xff0c;为全世界的用户带来了更多可能性。这一转变的其中一个重要方面是赋予女性权力&#xff0c;因为她们更踊跃参与元宇宙活动&#xff0c;并利用 Web3平台挑战传统边界。 The Sandbox 非常自豪能够开放、具包容性地为 womenint…

Swing如何使用?几个操作示例教会你!

以下是四个使用 Swing 组件创建的示例代码&#xff1a; 示例一&#xff1a;JFrame JFrame 是一个顶级容器&#xff0c;用于创建框架窗口。下面是一个简单的 JFrame 示例&#xff1a; import javax.swing.JFrame;/*** author: Ajie* create: 2023/6/21* Description:* FileNa…

OpenStack(1)-创建实例

目录 一、上传镜像 1.1 新建目录 1.2 上传至glance 1.3 查看镜像 二、新建实例 2.1 获取秘钥 2.2 新建实例 2.3 新建实例admin-vm 2.4 获取实例VNC的url 2.5 nova常用命令 一、上传镜像 1.1 新建目录 上传名为cirros-0.3.4-x86_64-disk.img的Linux测试镜像&#xf…

JdbcTemplate 数据访问工具

文章目录 前言JdbcTemplate 数据访问工具1. 概述2. 主要功能3. 示例 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&…

新时代的黑科技:就凭这个,还真就非JNPF低代码不可了

随着技术的不断进步&#xff0c;现代企业对软件开发的需求越来越迫切&#xff0c;传统的软件开发方式已无法满足快速迭代和创新的需求。在这种情况下&#xff0c;低代码开发平台应运而生。低代码开发平台通过提供可视化的开发工具和预构建的组件&#xff0c;大大加快了应用程序…

Docker的安装部署以及配置的操作流程(图文)

Docker的安装以及配置流程&#xff08;图文&#xff09; Docker一、配置域名解析二、CentOS Docker 安装1. 查询已安装的docker2. 安装必要的一些系统工具3. 添加软件源&#xff08;阿里云&#xff09;信息4. 更新并安装Docker-CE5. 查看docker 的版本6. 关闭运行的防火墙7. 开…

CMake 工程实践指南专栏介绍

CMake 工程实践指南专栏介绍 大家好,我是 eg,欢迎来到我的 CMake 工程实践指南专栏。本专栏会保持一周一更的节奏,带大家从一个 CMake 小白蜕变成 CMake 熟练使用者。 1. 我与 CMake 的故事 在正式内容开始之前,我想谈谈我和 CMake 的故事。我读书的时候是压根儿不知道 …

造手机、“+ AI”,掉队的蔚来瞎折腾?

对标豪华品牌BBA&#xff0c;自建换电站&#xff0c;蔚来汽车曾凭借先发优势&#xff0c;一度成为造车新势力的领头羊&#xff0c;但最近两个月&#xff0c;蔚来的单月交付量仅有6000多台&#xff0c;渐露掉队之相。 主业低迷&#xff0c;蔚来传出新消息。两天前&#xff0c;工…

c++lambda函数笔记

1、labmda函数用途&#xff1a; 用于简短功能函数的定义&#xff0c;并传递到std算法中。 2、一般函数与lambda函数比较示例 3、如何定义lambda 如下为lambda通用定义式子&#xff1a; [capture] (params) opt->ret{body;}; capture——捕获列表&#xff0c;[]为不捕获变量…

JAVA线程池submit详解 ,execute和submit提交任务的区别

文章目录 前言submit方法定义Future是什么execute、submit方法区别是什么submit主干流程逻辑newTaskFor做了什么FutureTasknewTaskFor(Runnable runnable, T value)的实现FutureTask(Callable<V> callable)的实现execute(ftask) FutureTask是如何实现线程池执行可获取返回…

java多线程简明笔记(5)线程礼让 yield

关键字&#xff1a;yield 官方文档就不说了&#xff0c;简单理解&#xff0c;礼让 线程礼让 yield正在执行的线程暂停&#xff0c;不阻塞 示例代码&#xff1a; public class ThreadTest7 implements Runnable{public static void main(String[] args) {ThreadTest7 tnew Th…

在线广告业务流程

一、业务流程 1、注册/登录 广告主登录系统&#xff0c;进行基本的鉴权&#xff0c;角色分配&#xff0c;账户管理。同时为营销参与者包括产品、运营、销售等提供登录、附身功能。 2、代理开户 & 订单合同管理 代理商可代理广告主开户&#xff0c;客户同样统一维护在用户…

帮你解锁 Android 性能优化五大误区和两大疑点!

近年来&#xff0c;社区充斥着关于 Android 性能优化的各种误区&#xff0c;本文本着误区终结者的精神&#xff0c;使用具体的性能检测工具&#xff0c;结合真实案例仔细分析这些情况&#xff0c;并对比它们的测试结果&#xff0c;也会聚焦 Android 开发者平时在编码过程的实际…

【CV 向】OpenCV 图形绘制指南

文章目录 引言1. 创建画布2. 绘制线段3. 绘制矩形4. 绘制圆5. 绘制椭圆6. 绘制多边形7. 绘制字体结论 引言 Python OpenCV 是一个功能强大的计算机视觉库&#xff0c;除了图像处理和计算机视觉任务外&#xff0c;它还提供了丰富的功能来绘制各种图形。无论是在计算机视觉应用中…