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

这篇具有很好参考价值的文章主要介绍了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 # 文件后缀名

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

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

有两种方式:

第一种方式:

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

第二种方式:

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

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

(1.3)多环境配置共享。

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

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

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

(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

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

(2)http客户端Feign。

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

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

(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);
}

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

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

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

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

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

(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 # 单个路径的最大连接数

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

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

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

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

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


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

(3)网关Gateway。

(3.1)网关的作用。

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

(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/**

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

(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]

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

(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!

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

(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;
    }
}

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

(3.6)过滤器执行顺序。

注意:

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

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

3、全局过滤器自己定义大小(默认的order值非常大)


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

(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 # 这次跨域检测的有效期

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

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

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

二、搭建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文件中的配置如下:文章来源地址https://www.toymoban.com/news/detail-499751.html

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

到了这里,关于39.SpringCloud—配置管理nacos、远程调用Feign、服务网关Gateway的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微服务Day3——Nacos配置管理\Feign远程调用\Gateway网关

    当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。 Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。

    2024年02月16日
    浏览(42)
  • Spring Cloud Day2 Nacos配置管理、Feign远程调用与Gateway服务网关

    Nacos除了可以做注册中心,同样可以做配置管理来使用。 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。 Nacos一方面可以将配置集中管理,另一方可以

    2024年02月10日
    浏览(65)
  • SpringCloud Alibaba(一)微服务简介+Nacos的安装部署与使用+Nacos集成springboot实现服务注册+Feign实现服务之间的远程调用+负载均衡+领域划分

    目录 一.认识微服务 1.0.学习目标 1.1.单体架构 单体架构的优缺点如下: 1.2.分布式架构 分布式架构的优缺点: 1.3.微服务 微服务的架构特征: 1.4.SpringCloud 1.5Nacos注册中心 1.6.总结 二、Nacos基本使用安装部署+服务注册 (一)linux安装包方式单节点安装部署 1. jdk安装配置 2. na

    2024年02月09日
    浏览(46)
  • 【微服务】SpringCloud之Feign远程调用

    🏡浩泽学编程 :个人主页  🔥 推荐专栏 :《深入浅出SpringBoot》《java对AI的调用开发》               《RabbitMQ》《Spring》《SpringMVC》《项目实战》 🛸学无止境,不骄不躁,知行合一 使用Feign远程调用代替RestTemplate远程调用。 使用RestTemplate发起远程调用: 虽然在引

    2024年04月15日
    浏览(31)
  • SpringCloud 核心组件Feign【远程调用&自定义配置】

    目录 1,Feign远程调用 1.1:Feign概述 1.2:Feign替代RestTemplate         1):引入依赖         2):添加注解         3):编写Feign的消费服务,提供服务         4):测试         5):总结 1.3:自定义配置 1.3.1:配置文件方式 1.3.2:Java代码方式 Feign是一款Java语言编写的

    2023年04月08日
    浏览(77)
  • 【SpringCloud Alibaba】Nacos服务管理与Feign负载均衡

    目录 一、微服务搭建 1.1 服务提供者与服务消费者 1.2 依赖关系   二、服务注册与负载均衡使用 2.1 Nacos 实现服务的注册与发现 2.2 Loadbalancer负载均衡、Feign声明式服务调用 2.3 示例综合实现 2.3.1 服务注册与发现测试 2.3.2 负载均衡测试  服务提供者 服务的被调用方(即:为其他微

    2024年02月03日
    浏览(46)
  • Nacos配置管理、Fegin远程调用、Gateway服务网关

    Nacos除了可以做注册中心,同样可以做配置管理来使用。 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。 Nacos一方面可以将配置集中管理,另一方可以

    2024年02月03日
    浏览(39)
  • SpringCloud --- Feign远程调用

    先来看我们以前利用RestTemplate发起远程调用的代码: 存在下面的问题: 代码可读性差,编程体验不统一 参数复杂URL难以维护 Feign是一个声明式的http客户端,官方地址:GitHub - OpenFeign/feign: Feign makes writing java http clients easier 其作用就是帮助我们优雅的实现http请求的发送,解决

    2024年02月05日
    浏览(39)
  • SpringCLoud——Feign的远程调用

    来看一下之前我们使用RestTemplate调用时编写的Contrriller代码: //        2. 利用RestTemplate发起HTTP请求 //        2.1 url 地址         String url = \\\"http://userserver/user/\\\" + order.getUserId(); //        2.2 发送http请求,实现远程调用         User user = restTemplate.getForObject(url,

    2024年02月07日
    浏览(38)
  • SpringCloud(七) Feign远程调用

    目录 一, RestTemplate远程调用存在的问题 二, Feign的远程调用 2.1 什么是Fegin 2.2 Feign的使用(代替RestTemplate) 1. 引入依赖 2. 添加注解  3. 编写Feign的客户端 4. 测试 5. 总结  2.3 自定义配置 1. 配置文件方式  2. Java代码方式  三, Feign使用优化 3.1 使用连接池 1. 引入依赖 2. 配置连接池

    2024年02月06日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包