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

目录

一、SpringCloud。

(1)Nacos配置管理。

(1.1)nacos中添加配置文件、微服务引入依赖,并配置bootstrap.yml文件。

(1.2)获取配置文件信息,实现热更新。

(1.3)多环境配置共享。

(1.4)多服务共享配置。

(2)http客户端Feign。

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

(2.2)导入feign依赖,开启feign,编写feign客户端。

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

(2.4)性能优化—连接池。

(2.5)Feign的最佳实践—两种方式。

(2.6)Feign的最佳实践—抽取feign模块。

(3)网关Gateway。

(3.1)网关的作用。

(3.2)搭建网关服务—导入依赖,配置路由。

(3.3)路由断言工厂。

(3.4)网关过滤器。

(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中添加配置文件、微服务引入依赖,并配置bootstrap.yml文件。

注意:如果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依赖,开启feign,编写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)自定义配置——日志配置。

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

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

(2.4)性能优化—连接池。

<!--引入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模块。

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)网关过滤器。

注意:过滤器工厂有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、全局过滤器自己定义大小(默认的order值非常大)


(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地址

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值