Linux nacos 集群 部署+idea2022 Spring cloud Alibaba 2022 OpenFeign
准备
安装mysql (192.168.1.101) 建库 nacos_config
集群部署方案
三台Linux服务器
nacos-server-01 192.168.1.136
nacos-server-02 192.168.1.137
nacos-server-03 192.168.1.138
下载nacos,
Releases · alibaba/nacos (github.com)
上传到Linux 服务器
解压缩
修改解压后目录中的conf/application.properties
修改集群配置文件 cluster.conf.example 保存后改名 cluster.conf
启动nacos
开机启动nacos集群
[root@machine136 nacos]# vim /lib/systemd/system/nacos.service [root@machine136 nacos]# systemctl enable nacos Created symlink from /etc/systemd/system/multi-user.target.wants/nacos.service to /usr/lib/systemd/system/nacos.service.
nacos.service 内容:
注意:/opt/module 为nacos所在目录
[Unit]
Description=nacos
After=network.target
[Service]
Type=forking
ExecStart=/opt/module/nacos/bin/startup.sh
ExecReload=/opt/module/nacos/bin/shutdown.sh
ExecStop=/opt/module/nacos/bin/shutdown.sh
PrivateTmp=true
[Install]
WantedBy=multi-user.target
~
查看日志是否成功
开发环境
IntelliJ IDEA 2022.2.4
SpringCloud SpringBoot Alibaba版本如下
<spring-boot.version>2.6.13</spring-boot.version> <spring-cloud.version>2021.0.5</spring-cloud.version> <spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version>
微服务
两个provider 服务
provider 8001
provider 8002
一个消费服务 order 88
provider 主要文件
pom
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>springclound</artifactId> <groupId>com.hztech</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>provider-payment8002</artifactId> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- hystrix 需要cloud 的版本支持 见 父项目的POM <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> --> <!-- nacos注册中心 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> </dependency> <!--mysql-connector-java--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--jdbc--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- 热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.11</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.hztech</groupId> <artifactId>cloud-api-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>
yam 注意 server-addr: 192.168.1.137:8848
server: port: 8002 spring: application: name: cloud-payment-service # 项目名,也是注册的名字 datasource: type: com.alibaba.druid.pool.DruidDataSource #当前数据源操作类型 driver-class-name: org.gjt.mm.mysql.Driver #mysql驱动包 url: jdbc:mysql://localhost:3306/hztech?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC username: root password: xxxxxx cloud: nacos: discovery: server-addr: 192.168.1.137:8848 inetutils: ignored-interfaces: 'VMware Virtual Ethernet Adapter for VMnet1,VMware Virtual Ethernet Adapter for VMnet8' mybatis: mapper-locations: classpath:mapper/*.xml # 所有Entity 别名类所在包 type-aliases-package: com.hztech.entities druid: test-while-idle: true validation-query: SELECT 1
order 88
pom
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>springclound</artifactId> <groupId>com.hztech</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>customer-order80</artifactId> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- hystrix <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> --> <!-- nacos注册中心 --> <!-- 由于SpringCloud Feign在Hoxton.M2 RELEASED版本之后不再使用Ribbon而是使用spring-cloud-loadbalancer, 所以不引入spring-cloud-loadbalancer会报错 解决方法 加入spring-cloud-loadbalancer依赖 并且在nacos中排除ribbon依赖,不然loadbalancer无效 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <exclusions> <exclusion> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-loadbalancer</artifactId> </dependency> <!-- openFeign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.hztech</groupId> <artifactId>cloud-api-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>
YAM 注意:server-addr: 192.168.1.136:8848
server:
port: 88
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.1.136:8848
inetutils:
ignored-interfaces: 'VMware Virtual Ethernet Adapter for VMnet1,VMware Virtual Ethernet Adapter for VMnet8'
application:
name: payment-order
OpenFeign 接口 完成微服务调用
@Service @FeignClient(value = "cloud-payment-service")//,fallback = PaymentFeignServiceFallbackImpl.class public interface PaymentFeignService { @PostMapping("/payment/create") public CommonResult<Payment> create(@RequestBody Payment payment) ; @GetMapping("/payment/get/{id}") public CommonResult<Payment> getPaymentById(@PathVariable( "id") Long id) ; }
运行项目
登录控制台,查看效果
两个provider 服务分别是对应一台 nacos-server ,order服务对应的server-addr是第三台服务器,
现在登录到任何一台都会看到3个完整的微服务,如下:
我自测过 用docker nacos 搭建cluster 后,显示 运行成功,控制台 集群 节点列表中正常显示 ,但是服务列表却是各自独立的(因为每个微服务分别 指向了一个集群中不同的主机)!! 这点要注意 尽量不用docker nacos.
停止一个机器后
/opt/module/nacos/bin/shutdown.sh
服务仍然可用
保留一个server 响应正常
但是,如果现在某个nacos 服务停止了,那么对应以此为注册地址的微服务就无法正常工作了,比如:订单服务 注册的nacos 是192.168.1.136 ,把运行在136 上的nacos 服务 shutdown
那么再访问 order服务就出问题了
微服务经过一段时间后也被下线了
订单服务前台提示错误
后台也打印错误信息:
2023-02-20 16:20:44.511 INFO 15476 --- [t.remote.worker] com.alibaba.nacos.common.remote.client :
[c5c5c18d-809b-43dd-b192-83ba88c57bab] Fail to connect server, after trying 51 times, last try server is {serverIp = '192.168.1.136', server main port = 8848}, error = unknown
其他任何一个微服务都存在这个问题,为解决这个问题,要用搭建高可用的nginx集群来解决:
方案见:
高可用Nacos服务实战 - hztech - 博客园 (cnblogs.com)