nacos使⽤-服务注册中⼼和配置中⼼
本例⼦基于 spring boot + spring cloud alibaba + spring cloud, nacos作为服务注册中⼼和配置中⼼。
简介
Nacos 是Spring Cloud Alibaba 的⼀个组件。致⼒于发现、配置和管理微服务。
Nacos名字:前四个字母分别为 Naming 和 Configuration 的前两个字母,最后的 s 为 Service。
下载启动
版本选择
如果是使⽤spring boot + spring cloud alibaba + spring cloud全家桶。那么版本选择⼀定要按照官⽹匹配,否则会因jar包冲突导致项⽬启动失败。
邮政包裹快递费查询我们可以去spring cloud alibaba的查看
在此⽂中,我选择的版本为spring boot - 2.2.5.RELEASE, spring cloud alibaba - 2.2.1.RELEASE, spring cloud - Hoxton.SR3
下载
根据上⾯的版本说明,我这⾥选择1.2.1
启动
下载解压后,进⼊bin⽬录
可以看到启动命令。其中cmd是window系统使⽤,sh是linux系统使⽤。
我们本地测试使⽤windows环境,直接双击d即可。linux环境请执⾏./startup.sh -m standalone (standalone代表单机启动,实际使⽤应做集,集数量三台起步)
查看控制台
nacos默认端⼝是8848,可不是某⼿机,8848代表珠穆朗玛峰的⾼度(但是现在⾼度好像是8844了)。
启动nacos后,访问localhost:8848/nacos/index.html,可以看到nacos后台。在这⾥可以对服务和配置做可视化管理(当然现在是空的,⼀会⼉项⽬启动就有东西了)。
注册中⼼
先看看如何作为服务注册中⼼
服务注册
1 项⽬pom添加依赖
<!-- spring boot 项⽬ -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 服务注册/发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- spring cloud alibaba 依赖管理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2 application.properties添加配置
# 服务端⼝
server.port=8081
# 服务名
spring.application.name=service-provider
# 服务注册中⼼地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
3 启动类上添加服务发现注解
@EnableDiscoveryClient
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
PS:这⾥不加@EnableDiscoveryClient也⾏,Spring Cloud Dalston.SR4版本之后会⾃动向注册中⼼注册4 启动查看
启动服务,刷新nacos后台就能看到这个服务了
服务调⽤
小学操行评语为了说明服务调⽤,我们先以同样的⽅式配置好另外⼀个服务
1 pom添加依赖
同上,略
2 application.properties添加配置
# 服务端⼝
server.port=9091
# 服务名
spring.application.name=service-consumer
# 服务注册中⼼地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
3 启动类
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
航空大学4 启动查看
可以看到,我们有两个微服务了
5 引⼊openfeign
openfeign是spring cloud的组件,为微服务之间的调⽤提供了解决⽅案。
openfeign的使⽤也⾮常简单,我们在service-consumer项⽬的基础上继续完善
1) pom添加依赖
<dependencies>
... //省略之前已添加
<!-- 服务调⽤ -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
... //省略之前已添加
<!-- spring cloud 依赖管理 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
钱学森颁奖词</dependencies>
</dependencyManagement>
2) 编写远程调⽤类
st.consumer.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient("service-provider")
public interface ProviderFeignService {
@RequestMapping("provider/test")
public Result providerTest(@RequestBody TestEntity testEntity, @RequestParam String name);
}
映射说明: @FeignClient括号⾥是要调⽤的微服务名称,@RequestMapping括号⾥是被调⽤微服务的具体api路径。传参说明: 实体类添加@RequestBody,字符串和普通类型添加@RequestParam。
这个service就和我们平时普通的service⼀样,在controller使⽤@Autowired依赖注⼊即可。
3) 启动类添加@EnableFeignClients
@EnableFeignClients(basePackages = "sumer.feign")
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
说明: @EnableFeignClients括号⾥是要实⾏远程调⽤服务所在的包路径,即上⾯远程调⽤类所在的包路径。现在回到service-provider添加⼀个测试controller就可以调⽤成功了
@RestController
@RequestMapping("provider")
public class TestController {
@PostMapping("test")
public Result test(TestEntity testEntity, String name) {
Result result = new Result();
// do something, balabala
return result;
}
}
Result是⾃定义返回类,略。
原理简述
服务注册中⼼的实现,⼤概依赖三个重要的定时任务
1. 客户端定时任务:定时发送⼼跳,告诉nacos我还活着
2. 客户端定时任务:定时拉取可⽤服务,放在本地缓存。openfeign调⽤时⾃⾏选⽤缓存中服务
3. 服务端定时任务,定时刷新可⽤列表,踢掉太久没发⼼跳的客户端【默认15秒未发⼼跳的会被踢出】⼩结
以上,我们实现了服务注册与发现,服务间远程调⽤。
配置中⼼
问题说明
随着业务越来越复杂,我们会⾯临⼀些问题:
1. 微服务项⽬越来越多,配置⽂件也越来越多,管理起更⿇烦
2. 改动⼀个配置参数时,需要重新打包微服务重新发布
3. 有时候希望改动某个参数可以⽴即⽣效
接下来,我们使⽤nacos解决这些问题。
1 添加pom依赖
<dependencies>
... //省略之前已添加
<!-- 配置中⼼ -->
<dependency>
如何建立自己的博客<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
wap歌词脏版知乎</dependency>
</dependencies>
2 在application.properties设置运⾏环境
spring.profiles.active=dev
3 新建bootstrap.properties⽂件
# 服务名
spring.application.name=service-consumer
# 配置中⼼地址
spring.fig.server-addr=127.0.0.1:8848
4 添加注解 @Value + @RefreshScope
@RefreshScope // ⾃动感知配置⽂件变化
@RequestMapping("test")
@RestController
public class TestController {
// 从配置⽂件获取属性值
@Value("{message}")
private String message;
@RequestMapping("message")
public String message() {
return message;
}
}
5 去nacos配置中⼼添加配置⽂件
这⾥Data Id就是配置⽂件名
6 启动服务,验证结果
服务启动时会去配置中⼼⽂件${prefix}-${spring.profile.active}.${file-extension}
1. prefix默认为spring.application.name,本例中即 service-consumer ;也可以通过配置spring.fig.prefix来指定
2. spring.profile.active就是当前环境对应的 profile,本例中即 dev ;如果spring.profile.active不存在,这之前的连接符-也将不存在,⽂件拼接格
式变为${prefix}.${file-extension}
3. file-extension就是⽂件后缀,默认为properties;可以通过配置spring.fig.file-extension来指定,但其值⽬前只⽀
持properties或yaml
根据上述说明,服务会去配置中⼼的⽂件就是service-consumer-dev.properties,也即是第5步新增的配置⽂件。
浏览器访问localhost:9091/test/message就可以看到返回结果为panda,即我们配置⽂件中的值。
然后去配置中⼼修改配置⽂件内容:
再次访问localhost:9091/test/message,可以看到返回结果变为panda2
如此,就解决了之前提到的三个问题:
1. 配置⽂件和项⽬包分开,配置⽂件可统⼀管理
2. 配置参数修改后,不需要重新打包项⽬,直接重启项⽬就能读到修改的值
3. 对于⼀些需要⽴即⽣效的参数,使⽤@Value + @RefreshScope组合
7 ⼩结
我们项⽬的启动脚本⾥⼀般会加上profile,如测试环境java -jar order.jar --spring.profile.active=test,⽣产环境java -jar order.jar --
spring.profile.active=prod。那么,同⼀个jar包,我们完全不需要任何改动,发布到不同环境,它⾃⼰就能读取到不同环境的配置⽂件。
⼀"⼀个jar包,到处发布"。⾮常的⽅便。
namespace & group
我们已经把配置⽂件从项⽬中抽离出来了,然⽽这⾥仍有⿇烦:如果我们有很多微服务,那么就对应有很多配置⽂件;这些⽂件还有各⾃不同环境的版本,也许还有不同业务场景下的版本。如果只是把这么多配置⽂件都单纯放在⼀起,那么维护起来也会很困难。
1 说明
为了解决配置⽂件太多不好管理的问题,我们可以使⽤nacos提供的命名空间(namesapce)和组(group)的概念。
namespace可以看成是⼀个独⽴的⼀级⽬录,namespace之间相互隔离;组可以看成namespace下⾯的⼆级⽬录,group之间同样隔离。
之前说,服务启动后会去配置中⼼${prefix}-${spring.profile.active}.${file-extension},其实前⾯还得加上命名空间和组;即到底是去哪个命名空间下⾯的哪个组配置⽂件。我们没有配置这两项,默认是去public下DEFAULT_GROUP该⽂件。
⽽我们创建配置⽂件时并没有指定命名空间和组,默认就放在了public下的DEFAULT_GROUP组。
所以才能正常读取到配置⽂件。
2 解决⽅案
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论