目录
本文开发环境介绍
开发依赖 | 版本 |
---|---|
Spring Boot | 2.6.6 |
Spring Cloud | 2021.0.1 |
Spring Cloud Alibaba | 2021.0.1.0 |
spring-cloud-alibaba-nacos-discovery | 2.2.0.RELEASE |
nacos能做什么
在微服务开发中,经常会用到注册中心和配置中心,最初大家使用Srping Cloud Eureka做为注册中心,Spring Cloud Config做为配置中心,随着技术的发展,后面流行的注册中心和配置中心越来越多,有consual、etcd、zookeeper、appollo、nacos、acm等等。
nacos就是其中一款比较受欢迎的,nacos既能做注册中心,也能做配置中心,稍微降低了我们开发、部署微服务的复杂度,并且是阿里公司的作品,有长期的技术团队维护。
如何让bootstrap.yml生效
提到微服务的配置中心,就不得不提bootstrap.yml,这个配置在Spring Cloud应用中比application.yml先加载,这样就实现了从配置中心获取配置的目的。
可是SpringBoot应用本身不会加载bootstrap.yml这个配置文件的,需要添加如下依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
bootstrap.yml生效后,才能在这里面指定配置中心,让配置中心的配置项覆盖本地application.yml中的配置项
nocos注册中心
添加如下依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
可以不用手动再加**@EnableDiscoveryClient**,因为在NacosDiscoveryAutoConfiguration这个类中已经开启了nacos注册的功能
@Configuration(proxyBeanMethods = false)
@ConditionalOnDiscoveryEnabled
@ConditionalOnNacosDiscoveryEnabled
public class NacosDiscoveryAutoConfiguration {
}
bootstrap.yml最小配置
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: demo-dubbo-nacos
启动SpringBoot程序,查看nacos服务列表页面
我们的服务正确的注册到nacos了
nacos server开启认证鉴权
在默认的Nacos server配置中,不会对客户端鉴权,即任何能访问Nacos server的用户,都可以直接获取Nacos中存储的配置。比如一个黑客攻进了企业内网,就能获取所有的业务配置,这样肯定会有安全隐患。
所以需要先开启Nacos server的鉴权。在Nacos server上修改application.properties中的nacos.core.auth.enabled值为true即可:
### If turn on auth system:
nacos.core.auth.enabled=true
如上设置后,Nacos客户端获取配置时,需要设置上对应的用户名和密码,才能获取配置。
然后可以在nacos管理控制台添加用户、设置权限等。
nacos开启认证后,应用程序的配置文件需要添加用户名密码
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: demo-dubbo-nacos
username: nacos
password: nacos
注册rest服务以及消费
上面已经成功把服务注册到nacos了,那么接下来我开发一个rest服务,然后再写一个消息端通过nacos发现这个rest服务并使用Feign组件进行调用。
服务生产者提供一个rest服务
直接上代码,利用SpringBoot提供的注解,快速提供一个rest接口
@RestController
public class DemoHelloController {
@GetMapping(path = "/hello")
public String hello(String name) {
return name+",hello!";
}
}
消费端
消费端pom.xml
消费端需要的完整依赖如下
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
消费端bootstrap.yml
如果消费端只需要从注册中心发现服务,并不需要注册服务,那么bootstrap.yml配置文件可以通过一个配置项控制,完整bootstrap.yml配置如下
spring:
application:
name: demo-dubbo-nacos-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: demo-dubbo-nacos
register-enabled: false
其中register-enabled: false
的作用就是不注册服务,可以达到我们只消费的目的。
消费端Feign
直接上代码
@FeignClient(name = "demo-dubbo-nacos")
public interface DemoProviderFeign {
@GetMapping(path = "/hello")
String hello(@RequestParam(name = "name") String name);
}
消费端Controller
@RestController
public class DemoHelloConsumerController {
@Resource
private DemoProviderFeign demoProviderFeign;
@GetMapping(path = "/hello")
public String hello(String name) {
return demoProviderFeign.hello(name);
}
}
测试验证
把消费端程序的端口改成8081
server:
port: 8081
启动后执行curl测试
curl -ik "http://localhost:8081/hello?name=xxx"
响应结果如下
$ curl -ik "http://localhost:8081/hello?name=xxx"
HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8
Content-Length: 10
Date: Tue, 05 Apr 2022 08:31:21 GMT
xxx,hello!
总结
这篇文章主要介绍了nacos做为注册中心的使用,以及如何使用Srping Cloud中的Feign进行消费,从上面的例子可以看出,仅仅是把注册中心替换成了nacos,微服务间的Feign调用并不受任何影响。后续会介绍nacos做为配置中心,以及dubbo服务的发布与消费。