文章目录
微服务简介
微服务概念
简单的说微服务是一种架构上的设计风格,它的主旨是将原本独立的系统拆分为一个一个小型服务,这些小型服务在独立的进程中运作,服务之间通过 HTTP 的 RESTful API 进行通信协作。被拆分的小型服务围绕着系统中某一个或者某一耦合度较高的业务功能进行构建,并且每个服务独立维护自己的数据存储、业务开发、自动化测试以及独立部署机制。由于有了轻量级的通信协作,所以这些微服务可以通过不同的语言来编写。
微服务拆分注意事项
- 不同微服务,不要重复开发相同业务
- 微服务数据独立,不要访问其它微服务的数据库
- 微服务可以将自己的业务暴露为接口,供其它微服务调用
微服务实例
Springcloud提供了RestTemplate,用于不同模块之间访问接口,获取返回值
使用前需要new一个RestTemplate,注入容器
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
改造Order的service,向User模块发起请求,访问User模块
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.请求调用
String url = "http://localhost:8081/user/"+order.getUserId();
User user = restTemplate.getForEntity(url,User.class);
// 3.封装user到Order
order.setUser(user);
// 4.返回
return order;
}
eureka
eureka简介
springcloud封装了Netflix公司开发的Eureka模块来实现服务治理。
在传统的rpc远程调用框架中,管理每个服务于服务之间的依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务与服务之间得依赖管理,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
eureka作用
- 消费者该如何获取服务提供者具体信息?
- 服务提供者启动时向eureka注册自己的信息
- eureka保存这些信息
- 消费者根据服务名称向eureka拉取提供者信息
- 如果有多个服务提供者,消费者该如何选择?
- 服务消费者利用负载均衡算法,从服务列表中挑选一个
- 消费者如何感知服务提供者健康状态?
- 服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态
- eureka会更新记录服务列表信息,心跳不正常会被剔除
- 消费者就可以拉取到最新的信息
eureka服务端实操
- 新建moudle,引入核心依赖
<dependencies>
<!--eureka服务端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
- 启动类注解开启EurekaServer自动装配
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
- application.yml进行eureca配置
server:
port: 10086 # 服务端口
spring:
application:
name: eurekaserver # eureka的服务名称
eureka:
client:
service-url: # eureka的地址信息
defaultZone: http://127.0.0.1:10086/eureka
-
访问localhost:10086,进入eureca控制台
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K3ArOhXQ-1641344417967)(C:\Users\Acerola\AppData\Roaming\Typora\typora-user-images\image-20220102230657768.png)]
eureka客户端实操
-
在service模块下的pom文件加入核心依赖
<!--eureka客户端依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
yml文件中配置eureca
eureka: client: service-url: # eureka的地址信息 defaultZone: http://127.0.0.1:10086/eureka
eureca注册总结
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ItAWCVyE-1641344417969)(C:\Users\Acerola\AppData\Roaming\Typora\typora-user-images\image-20220102233007106.png)]
ribbon和eureca
ribbon简介
Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为。为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。
在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。展示了Ribbon与Eureka配合使用时的架构。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ep51dnSY-1641344417970)(C:\Users\Acerola\AppData\Roaming\Typora\typora-user-images\image-20220103080435230.png)]
详细流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Ul93NNY-1641344417971)(C:\Users\Acerola\AppData\Roaming\Typora\typora-user-images\image-20220103093320503.png)]
IRule负载均衡规则
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DAopDA2I-1641344417972)(C:\Users\Acerola\AppData\Roaming\Typora\typora-user-images\image-20220103094625178.png)]
修改IRule规则
- 方法一,代码方式,在启动类注入IRule类型的对象(任意配置类都可以),定义一个新的IRule,全局生效
@Bean
public IRule randomRule(){
return new RandomRule();
}
- 方法二,配置文件,在application.yml添加新的配置规则,针对某个服务单独配置
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡规则(随机)
- 配置文件优先级低于代码注入
ribbbon饥饿加载
Ribbon默认是采用懒加载,即第一-次访问时才 会去创建L oadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时, 通过下面配置开启饥饿加载:
ribbon:
eager-load:
enabled: true # 开启饥饿加载
clients: # 指定饥饿加载的服务名称
- userservice
ribbon总结
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DTnfhNv2-1641344417973)(C:\Users\Acerola\AppData\Roaming\Typora\typora-user-images\image-20220103120608683.png)]
nacos
nacos简介
是阿里巴巴开源的一款支持服务注册与发现,配置管理以及微服务管理的组件。用来取代以前常用的注册中心(zookeeper , eureka等等),以及配置中心(spring cloud config等等)。Nacos是集成了注册中心和配置中心的功能,做到了二合一。
nacos安装
略
nacos注册中心
-
父工程添加nacos依赖
<!--nacos的管理依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.5.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>
-
添加nacos依赖,客户端如果有eureca依赖,需要删除
<!-- nacos客户端依赖包 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
配置文件添加nacos配置,如果有eureca配置,需要清除
spring: cloud: nacos: server-addr: http://192.168.2.103:8848 # nacos服务地址
-
启动即可看见实例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bU24koNA-1641344417973)(C:\Users\Acerola\AppData\Roaming\Typora\typora-user-images\image-20220103190356328.png)]
nacos服务模型
服务-集群-实例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tCSLoLfV-1641344417974)(C:\Users\Acerola\AppData\Roaming\Typora\typora-user-images\image-20220103190851849.png)]
集群设置
spring:
cloud:
nacos:
server-addr: http://192.168.2.103:8848 # nacos服务地址
discovery:
cluster-name: HZ #集群名称杭州
配置后
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jihdwEs8-1641344417975)(C:\Users\Acerola\AppData\Roaming\Typora\typora-user-images\image-20220103202150864.png)]
根据集群负载均衡
-
在order-service中设置负载均衡的IRule为NacosRule,这个规则优先会寻找与自己同集群的服务,同时在自己同集群中会随机进行负载均衡
userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #负载均衡规则
-
如果找不到同集群的服务,才会尝试跨集群服务,并进行警告
加权负载均衡
对服务进行权重设置,权重为0-1,设置为0则不会被访问,默认为1,则是NacosRule的随机访问,以此来控制流量,可以实现灰度更新
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F5TxvQ7E-1641344417976)(C:\Users\Acerola\AppData\Roaming\Typora\typora-user-images\image-20220103213317872.png)]
总结
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8MqvxyEe-1641344417978)(C:\Users\Acerola\AppData\Roaming\Typora\typora-user-images\image-20220103213645189.png)]
环境隔离
Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西, 用来做最外层隔离
-
新建一个命名空间
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wngknmiR-1641344417979)(C:\Users\Acerola\AppData\Roaming\Typora\typora-user-images\image-20220103215622425.png)]
-
复制命名空间id,并在配置文件中配置
discovery: namespace: 3bb9e056-0291-44c5-aaf9-255e6b24cae5 # dev环境
nacos配置管理
统一配置管理
在nacos控制中心添加配置,这样就完成了统一配置管理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XXhgpgzQ-1641344417982)(C:\Users\Acerola\AppData\Roaming\Typora\typora-user-images\image-20220104144538161.png)]
但是我们需要先读取nacos中的配置再读取本地配置,进行合并后完成项目启动,在spring中,bootstrap.yml比application.yml有更高的优先级,因此将nacos相关的配置依赖全部放入bootstrap.yml[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RsZEt9H6-1641344417983)(C:\Users\Acerola\AppData\Roaming\Typora\typora-user-images\image-20220104143802805.png)]
具体配置流程
-
引入nacos的配置管理客户端依赖
<!--nacos的配置管理依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
-
新建引导文件,bootstrap.yml,其中,name+active+file-extension就是在nacos控制中心添加的Data ID,这样就绑定了nacos注册中心的配置文件
spring: application: name: userservice profiles: active: dev # 环境 cloud: nacos: server-addr: http://192.168.137.133:8848 # nacos地址 discovery: cluster-name: HZ config: file-extension: yaml # 文件后缀名
配置热更新
-
方法一,在
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jqr8gQ9J-1641344417985)(C:\Users\Acerola\AppData\Roaming\Typora\typora-user-images\image-20220104162518499.png)]
-
方法二
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EYF0P87u-1641344417986)(C:\Users\Acerola\AppData\Roaming\Typora\typora-user-images\image-20220104164048580.png)]
总结
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5WAPsUlZ-1641344417988)(C:\Users\Acerola\AppData\Roaming\Typora\typora-user-images\image-20220104164126981.png)]
配置共享
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PSGdrBUV-1641344417989)(C:\Users\Acerola\AppData\Roaming\Typora\typora-user-images\image-20220104165831662.png)]
配置优先级:
服务名-profile.yaml > 服务名称.yaml > 本地配置
搭建nacos集群
-
集群结构图
官方给出的Nacos集群图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1m3EYaNJ-1641344417991)(D:/Idea/cloud-demo/day02-SpringCloud02/资料/assets/image-20210409210621117.png)]
其中包含3个nacos节点,然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。
我们计划的集群结构:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O4o1ZgjX-1641344417992)(D:/Idea/cloud-demo/day02-SpringCloud02/资料/assets/image-20210409211355037.png)]
三个nacos节点的地址:
节点 | ip | port |
---|---|---|
nacos1 | 192.168.150.1 | 8845 |
nacos2 | 192.168.150.1 | 8846 |
nacos3 | 192.168.150.1 | 8847 |
-
搭建集群
搭建集群的基本步骤:
- 搭建数据库,初始化数据库表结构
- 下载nacos安装包
- 配置nacos
- 启动nacos集群
- nginx反向代理
2.1. 初始化数据库
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.2.下载nacos
nacos在GitHub上有下载地址:https://github.com/alibaba/nacos/tags,可以选择任意版本下载。
本例中才用1.4.1版本:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bZXrrXNg-1641344417995)(D:/Idea/cloud-demo/day02-SpringCloud02/资料/assets/image-20210409212119411.png)]
2.3 配置Nacos
将这个包解压到任意非中文目录下,如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I6jiqI31-1641344417996)(D:/Idea/cloud-demo/day02-SpringCloud02/资料/assets/image-20210402161843337.png)]
目录说明:
- bin:启动脚本
- conf:配置文件
进入nacos的conf目录,修改配置文件cluster.conf.example,重命名为cluster.conf:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TEU6rr6b-1641344417998)(D:/Idea/cloud-demo/day02-SpringCloud02/资料/assets/image-20210409212459292.png)]
然后添加内容:
127.0.0.1:8845
127.0.0.1.8846
127.0.0.1.8847
然后修改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
2.4 启动
将nacos文件夹复制三份,分别命名为:nacos1、nacos2、nacos3
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Wr41Xj8-1641344418000)(D:/Idea/cloud-demo/day02-SpringCloud02/资料/assets/image-20210409213335538.png)]
然后分别修改三个文件夹中的application.properties,
nacos1:
server.port=8845
nacos2:
server.port=8846
nacos3:
server.port=8847
然后分别启动三个nacos节点:
startup.cmd
2.5 nginx反向代理
找到课前资料提供的nginx安装包:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H7slT3Zs-1641344418001)(D:/Idea/cloud-demo/day02-SpringCloud02/资料/assets/image-20210410103253355.png)]
解压到任意非中文目录下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LGwXkLmx-1641344418002)(D:/Idea/cloud-demo/day02-SpringCloud02/资料/assets/image-20210410103322874.png)]
修改conf/nginx.conf文件,配置如下:
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;
}
}
而后在浏览器访问:http://localhost/nacos即可。
代码中application.yml文件配置如下:
spring:
cloud:
nacos:
server-addr: localhost:80 # Nacos地址
2.6 优化
-
实际部署时,需要给做反向代理的nginx服务器设置一个域名,这样后续如果有服务器迁移nacos的客户端也无需更改配置.
-
Nacos的各个节点应该部署到多个不同服务器,做好容灾和隔离
os节点:
startup.cmd
2.5 nginx反向代理
找到课前资料提供的nginx安装包:
[外链图片转存中…(img-H7slT3Zs-1641344418001)]
解压到任意非中文目录下:
[外链图片转存中…(img-LGwXkLmx-1641344418002)]
修改conf/nginx.conf文件,配置如下:
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;
}
}
而后在浏览器访问:http://localhost/nacos即可。
代码中application.yml文件配置如下:
spring:
cloud:
nacos:
server-addr: localhost:80 # Nacos地址
2.6 优化
-
实际部署时,需要给做反向代理的nginx服务器设置一个域名,这样后续如果有服务器迁移nacos的客户端也无需更改配置.
-
Nacos的各个节点应该部署到多个不同服务器,做好容灾和隔离