开年公司架构调整,准备走微服务架构,大佬们讨论后大概就是springcloud系列了,之前也有过springcloud核心组件的学习,不过现在得集成Nacos来替代官方推荐的eureka与config作为注册中心和分布式配置中心。
1.下面弄来一张对比图,看一下:
对比:
1.性能也不差,对于服务数量小于上千台来说,性能没有问题
2.eureka: 可以做注册中心,完全AP,支持注册中心之间的节点复制,同时支持服务端同时注册多个注册中心节点, 所以不存节点信息不一致的情况
3.config: 单独服务,是从git仓库拉取配置信息,然后服务端从config服务里面拉取配置信息缓存到本地仓库, 这里配置的变更比较麻烦,他需要结合bus组件,同时约束了只能用rabbitmq和kafka来进行通知服务端进行配置变更。
但是保证了数据的一致性,因为他的配置信息在git仓库上,git仓库只有一个,就会数据一致
下面就直接来看speingcloud集成nacos步骤,先测试服务注册与发现,再测试分布式配置中心:
1.启动Nacos服务并配置
nacos下载地址:nacos下载
2.启动
- Linux/Unix/Mac 操作系统,执行命令
sh startup.sh -m standalone
- Windows 操作系统,执行命令
cmd startup.cmd
- 默认账户密码:nacos
3.进入nacos页面:http://localhost:8848/nacos/index.html
4.在某个微服务(生产者)的pom中导入jar包
<!-- 注册中心所需依赖 用于服务注册与发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<!-- 配置中心所需依赖 用于分布式配置-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
5.新建bootstrap.yml配置文件,内容如下
# Spring
spring:
application:
name: springcloud-provider-jobinfo
profiles:
# 环境配置
active: dev
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8848
config:
# 配置中心地址
server-addr: 127.0.0.1:8848
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
# 配置组,需要与nacos上一致,否则找不到
group: nacos-test
#命名空间默认是public,无需填。在nacos新建命名空间时,需要填写命名空间id
namespace:
6.启动类上加注解@EnableDiscoveryClient //服务发现~,启动服务发现与注册功能。
7.生产者写api,供消费服务调用:
@RestController
public class QcpageProviderController {
@Autowired
QcpageService qcpageService;
@Autowired
DiscoveryClient client;
@GetMapping("/qcpage/getAll")
public List<Qcpage> getAll(){
List<Qcpage> list= qcpageService.list();
return list;
}
@GetMapping("/qcpage/getById/{id}")
public Qcpage getById(@PathVariable("id")Integer id){
Qcpage qcpage=qcpageService.getById(id);
return qcpage;
}
@DeleteMapping("/qcpage/deleteById/{id}")
public boolean deleteById(@PathVariable("id")Integer id){
boolean flag=qcpageService.removeById(id);
return flag;
}
//获取注册进来的微服务,可以获得一些微服务信息,服务发现
@GetMapping("/qcpage/getservice")
public Object getService(){
List<String> service=client.getServices();
System.out.println("service:"+service);
List<ServiceInstance> instances=client.getInstances("springcloud-provider-jobinfo");
for (ServiceInstance instance : instances) {
System.out.println("serviceId:"+instance.getServiceId());
System.out.println("InstanceId:"+instance.getInstanceId());
System.out.println("host:"+instance.getHost());
System.out.println("port:"+instance.getPort());
}
return this.client;
}
}
7.启动该服务,进入nacos页面,点击服务管理-服务列表,可以看到服务已经注册到nacos:
8.再创建一个微服务(消费者)用于服务调用,同样先导入上述两个jar包,新建bootstrap.yml配置文件,在启动类上加注解@EnableDiscoveryClient。由于消费者无需多余的配置,无任何业务,所以不用再添加nacos的config配置,直接忽略,bootstrap.yml内容如下:
server:
port: 10010
# Spring
spring:
application:
# 应用名称
name: springcloud-nacos
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8848
9.添加ConfigBean配置类如下:
@Configuration
public class ConfigBean {
@Bean
@LoadBalanced //此注解开启请求时使用ribbon负载均衡
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
10.添加controller用于调用生产者服务api:
@RestController
public class TestController {
@Autowired
private RestTemplate restTemplate;
//开启负载均衡后,主机名与端口号使用服务名代替
private static final String PRIFIX="http://springcloud-provider-jobinfo";
@RequestMapping("/consumer/jobinfo/getConfig")
public String getConfig(){
return restTemplate.getForObject(PRIFIX+"/qcpage/getConfig",String.class);
}
@RequestMapping("/consumer/jobinfo/getById/{id}")
public Qcpage getById(@PathVariable("id")Integer id){
return restTemplate.getForObject(PRIFIX+"/qcpage/getById/"+id,Qcpage.class);
}
@RequestMapping("/consumer/jobinfo/getAll")
public List<Qcpage> getAll(){
return restTemplate.getForObject(PRIFIX+"/qcpage/getAll",List.class);
}
@RequestMapping("/consumer/jobinfo/deleteById/{id}")
public void deleteById(@PathVariable("id")Integer id){
restTemplate.delete(PRIFIX+"/qcpage/deleteById/{id}",id);
}
}
11.启动消费者服务,并进入nacos页面,服务管理-服务列表,两个微服务都已注册进来:
12.现在使用消费服务调用生产服务,我的消费端接口为http://localhost:10010/consumer/jobinfo/getById/{id},调用一下试试,会通过RestTemplate远程调用生产服务的接口
:
服务注册与发现就完了,接下来进行分布式配置中心的使用步骤:
1.先在nacos添加服务所需的配置:
新建配置:
- 理论: Nacos中的datatid的组成格式及与SpringBoot配置文件中的匹配规则
在Nacos Spring Cloud中,dataId
的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。spring.profile.active
即为当前环境对应的profile。注意:当spring.profile.active
为空时,对应的连接符-
也将不存在,dataId的拼接格式变成${prefix}.${file-extension}
file-extension
为配置内容的数据格式,可以通过配置项为spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
和yaml
类型。
下面是我的配置,我将生产服务的配置内容copy到了这里,加下来以生产服务为例:
2.bootstrap.yml配置如下:
# Spring
spring:
application:
name: springcloud-provider-jobinfo
profiles:
# 环境配置
active: dev
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8848
config:
# 配置中心地址
server-addr: 127.0.0.1:8848
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
# 配置组,需要与nacos上一致,否则找不到
group: nacos-test
#命名空间默认是public,无需填。在nacos新建命名空间时,需要填写命名空间id
namespace:
3.将原有配置注释,并提供接口用于获取远程的配置属性:
@RestController
@RefreshScope
public class QcpageProviderController {
@Value(value = "${info.company.name}")
private String companyName;
@Value(value = "${info.author.name}")
private String authorName;
@GetMapping("/qcpage/getConfig")
public String getInfo(){
return authorName+companyName;
}
}
4.调用接口,看是否能从nacos上拉取配置:
5.在不重启项目的前提下,修改nacos上的配置,然后再次调用看结果:
这样就可一方便集中管理各项目的配置文件,并在修改配置时,无需重启项目,对于线上环境以及开发时节省了很多时间。