Spring Cloud Alibaba 之Nacos
背景
出现的原因,替代一些已经不再维护的一些项目:
Nacos下载与安装
Nacos:替代Eureka做服务中心,替代Config做服务配置中心。下载地址
解压后运行(需要jdk8+maven环境),访问,默认账号密码均为为nacos。
创建服务提供者
然后创建服务提供者的项目,入驻到nacos,相关配置如下:
首先在父工程引入依赖:
<!--spring cloud alibaba 2.1.0.RELEASE--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>
然后在当前项目的pom里引入:
<!--SpringCloud ailibaba nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
然后在yml里配置服务名与nacos地址:
server: port: 9001 spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848 #配置Nacos地址 management: endpoints: web: exposure: include: '*'
最后在启动类加上@EnableDiscoveryClient注解即可。
随便编写个接口,然后启动项目:
package com.atguigu.springcloud.alibaba.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; /** * @author baikunlong * @date 2020/12/17 18:32 */ @RestController public class PaymentController { @Value("${server.port}") private String serverPort; @GetMapping(value = "/payment/nacos/{id}") public String getPayment(@PathVariable("id") Integer id) { return "nacos registry, serverPort: " + serverPort + "\t id" + id; } }
进入nacos的服务列表查看,可以看到服务已经进来了:
nacos是默认有负载均衡的,因为它默认整合了ribbon:
所以为了测试负载均衡,接下来再创建一个9002的服务,直接复制9001改改端口即可(练习还是用这个,后面个方法调试用用就行)。也可以使用虚拟端口映射的方式:
启动9002服务后,可以看到服务已经入驻成功了:
使用端口进行访问,可以看到均能成功访问:
创建服务消费者
pom和上面的提供者一样,yml里改个端口和加个自定义的访问服务名:
server: port: 83 spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: localhost:8848 #自定义的消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者) service-url: nacos-user-service: http://nacos-payment-provider
然后配置写个配置类,生成远程调用需要用到的RestTemplate实例,注意这里一定加@LoadBalance注解,因为用的ribbon:
package com.atguigu.springcloud.alibaba.config; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; /** * @author baikunlong * @date 2020/12/17 20:12 */ @Configuration public class ApplicationContextConfig { @Bean //使用ribbon必须加该注解,否则报错找不到服务名 @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } }
控制器代码如下:
package com.atguigu.springcloud.alibaba.controller; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; /** * @author baikunlong * @date 2020/12/17 20:11 */ @RestController @Slf4j public class OrderNacosController { @Resource private RestTemplate restTemplate; @Value("${service-url.nacos-user-service}") private String serverURL; @GetMapping(value = "/consumer/payment/nacos/{id}") public String paymentInfo(@PathVariable("id") Long id) { return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class); } }
然后启动项目,可以看到消费者服务也入驻了:
然后访问测试负载均衡也没问题:
Nacos配置中心
首先在配置管理下添加一个配置,Data ID命名规范下面再说:
然后创建一个module,pom里引入config这个依赖
<!--nacos-config--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
然后在application.yml里配置当前激活的配置文件:
spring: profiles: active: dev # 表示开发环境
创建bootstrap.yml文件(该文件的级别比application.yml高,优先加载):
# nacos配置 server: port: 3377 spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localhost:8848 #Nacos服务注册中心地址 config: server-addr: localhost:8848 #Nacos作为配置中心地址 file-extension: yaml #指定yaml格式的配置(nacos配置那边是yaml后缀,不是yml)
到这里就能解释上面的Data ID配置规范了:s p r i n g . a p p l i c a t i o n . n a m e − {spring.application.name}-spring.application.name−{spring.profile.active}.${spring.cloud.nacos.config.file-extension}
然后编写启动类,记得@EnableDiscoveryClient注解,然后写个控制器测试下是否能从配置中心获取配置:
package com.atguigu.springcloud.alibaba.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * @author baikunlong * @date 2020/12/18 10:56 */ @RestController @RefreshScope //支持Nacos的动态刷新功能。 public class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/config/info") public String getConfigInfo() { return configInfo; } }
到这里访问http://localhost:3377/config/info 就能成功看到返回信息了,在控制器这里加了@RefreshScope,nacos默认就有了动态刷新功能,不用像Spring Cloud Config那样各种配置然后还要手动访问地址刷新,在这里测试下nacos的动态刷新:
可以看到在更改配置后,打开新窗口访问马上就刷新了。
到这里,Nacos已经完成了Eureka注册中心和Config配置中心的功能,接下来看看它还有什么更好用的东西。
nacos有着分组和命名空间的功能:namespace>group>data id,在配置页配置一下做个测试:
yml配置文件里增加代码:
访问看看可以看到访问成功:
接下来就是更改数据库了:
首先就是创建nacos_config数据库,执行nacos-mysql.sql脚本,然后在application.properties里添加:
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=nacos_devtest #记得改成你的用户名 db.password=youdontknow #记得改成你的密码
nacos官网:https://nacos.io/zh-cn/docs/deployment.html
因为我用的mysql8.x,1.1.4的nacos启动报错,虽然有修改版,但是官网有新版已经解决了,所以这里更新下nacos的版本为1.4.0:https://github.com/alibaba/nacos/releases/tag/1.4.0 ,然后要更改一下启动模式,否则会报错,默认是cluster集群模式,我们这里暂时用单机模式启动。
然后可以看到,现在的数据是使用mysql进行存储了:
以上均为windows操作,接下来全是在linux上操作。
到这里单机版的nacos就搭建完毕,接下来准备搭建集群版,使用linux版:
集群版开始使用老版本了,因为1.4.0的版本真的折腾了很久,各种报错心态崩了,mysql也是安装的5.7版本,记得创建数据库和执行sql。
下载地址:https://github.com/alibaba/nacos/releases/download/1.1.4/nacos-server-1.1.4.tar.gz
下载速度过慢可以用加速试试:https://toolwa.com/github/
下载好后进行解压:tar -zxvf nacos-server-1.1.4.tar.gz
1.修改conf下的application.properties,在最后添加如下代码
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=Asia/Shanghai db.user=root db.password=123456
2.在conf下创建cluster.conf,内容为集群的节点地址:
192.168.5.128:3333 192.168.5.128:4444 192.168.5.128:5555
3.修改bin下的startup.sh
到这里修改完毕,可以启动了:
./startup.sh -p 3333 ./startup.sh -p 4444 ./startup.sh -p 5555 tail -f -n +0 /mynacos/logs/start.out #查看日志
接下来配置nginx:
http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; upstream cluster{ server 127.0.0.1:3333; server 127.0.0.1:4444; server 127.0.0.1:5555; } server { listen 1111; server_name localhost; location / { proxy_pass http://cluster; } } }
然后启动nginx(我的是yum安装的默认目录):/usr/sbin/nginx -c /etc/nginx/nginx.conf
然后访问可以看到终于成功了:
然后启动9001项目,可以看到服务已经注册进去了:
创建一个配置,可以看到数据库里直接插入成功了。
到这里nacos的基本使用终于结束了。