下载安装nacos
从github下载,nacos。直接解压就可使用。
ncos目录结构:
bin:nacos 启动目录
conf:nacos集群配置,启动配置
target:nacoss server 存放目录
单独部署
#单独部署执行下面命令,linux 使用startup.sh
./startup.cmd -m standalone
集群部署
准备三个nacos副本:
在每个nacos的./conf目录中分别编辑cluster.conf,使用同样的内容:
# 同台服务部署
192.163.76.190:8847
192.163.76.190:8848
192.163.76.190:8849
# 不同服务器部署,8848为默认端口号
#192.163.76.191:8848
#192.163.76.192:8848
#192.163.76.193:8848
三个nacos 实列分别使用如下配置,主要指定启动端口和mysql连接(用来保存注册信息和配置信息)。
# nacos
server.port=8848
#nacos2
server.port=8847
#nacos3
server.port=8849
mysql使用同一个连接:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=nacos
使用如下脚本创建ncos 相关数据库和表:
GitHub - hfengzhao/nacos-mysql8.0.sql: nacos 连接建库建表语句
启动nacos集群
分别在三个nacos目录使用./startup.cmd启动nacos服务,出现如下信息说明nacos启动成功:
2023-10-21 11:05:36,291 INFO The server IP list of Nacos is [21.163.76.190:8847, 21.163.76.190:8848, 21.163.76.190:8849]
2023-10-21 11:05:37,307 INFO Nacos is starting...
2023-10-21 11:05:38,325 INFO Nacos is starting...
2023-10-21 11:05:39,336 INFO Nacos is starting...
2023-10-21 11:05:40,351 INFO Nacos is starting...
2023-10-21 11:05:41,367 INFO Nacos is starting...
2023-10-21 11:05:42,374 INFO Nacos is starting...
2023-10-21 11:05:43,381 INFO Nacos is starting...
2023-10-21 11:05:44,393 INFO Nacos is starting...
2023-10-21 11:05:44,909 INFO Nacos started successfully in cluster mode. use external storage
新建命名空间
浏览器访问http://localhost:8848/nacos/,新建命名空间:
新建命名空间nacostest,命名空间可以自己填,也可以不填(自动生成)
新建配置
在命名空间nacostest中新增三个配置文件:
dev 环境 | nacos-application-test-dev.yaml |
server:
port: 8081
common 配置 | nacos-test-common.yaml |
nacos:
common:
info: hello nacos!
dev1 配置 | nacos-test-common.yaml |
server:
port: 8082
新建test项目
引入nacos服务注册和配置依赖
<!--nacos 配置中心依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${nacos.version}</version>
</dependency>
<!-- nacos 注册中心依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${nacos.version}</version>
</dependency>
添加bootstrap.yml
#nacostest命名空间id
nacos:
namespace:
id: 45b901ff-0a18-44c2-a886-64da03c2f526
spring:
application:
name: nacos-application-test
profiles:
active: ${ENV:dev} # 默认dev环境
main:
allow-bean-definition-overriding: true
cloud:
nacos:
username: nacos
password: nacos
# 配置中心配置
config:
server-addr: 192.168.1.13:8848 # nacos服务地址
namespace: ${nacos.namespace.id} # 命名空间id
group: ${spring.profiles.active} # 配置组
file-extension: yaml
prefix: ${spring.application.name}
data-id: ${spring.application.name}-${spring.profiles.active}.yaml
username: nacos
password: nacos
shared-configs[0]: # 公共配置
data-id: nacos-test-common.yaml
group: common # 公共配置组
refresh: true
# 注册中心配置
discovery:
server-addr: 192.168.1.13:8848
namespace: ${nacos.namespace.id} # 命名空间
group: ${spring.profiles.active} # 应用分组
username: nacos
password: nacos
metadata:
active: ${spring.profiles.active}
version: 1.4.5
添加controller和application
package org.example.controller;
import org.example.client.ProviderClient;
import org.springframework.beans.factory.annotation.Autowired;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RequestMapping("/test")
@RestController
public class TestController {
@Autowired
private ProviderClient providerClient;
@Value("${spring.cloud.nacos.discovery.server-addr}")
private String nacosServer;
@Value("${spring.profiles.active}")
private String activeProfile;
@Value("${server.port}")
private String port;
@Value("${nacos.common.info}")
private String commonInfo;
@GetMapping("/test")
public Map<String,String> test(){
Map<String,String> map = new HashMap<>(16);
map.put("nacos",this.nacosServer);
map.put("activeProfile",this.activeProfile);
map.put("port",this.port);
map.put("info",this.commonInfo);
return map;
}
}
创建一个controller读取server.port和nacos.common.info的配置内容返回到前端。
package org.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableDiscoveryClient
@SpringBootApplication
public class NacosTestApplication {
public static void main(String[] args) {
SpringApplication.run(NacosTestApplication.class,args);
}
}
启动应用服务可以看到服务nacos-application-test成功注册到nacos注册中心:
浏览器访问localhost:8081/test/test,显示dev信息:
port是nacos-application-test-dev.yaml配置中的端口号,info是nacos-test-common.yaml中的配置信息。
使用mvn clean packge 打包test项目。切换到项目根目录执行:
mvn clean package
打包成功后,在target目录运行dev1:
$ java -jar -DENV=dev1 test-1.0-SNAPSHOT.jar
运行后查看注册中心已注册成功(多出了dev1分组):
浏览器访问localhost:8082/test/test,显示dev1的信息:
port是nacos-application-test-dev1.yaml配置中的端口号,info是nacos-test-common.yaml中的配置信息。
openfeign实现服务间调用
1、引入相关依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
2、创建provider:provider 只使用nacos的注册中心功能。provider 的application.yml配置:
server:
port: 8083
# 服务注册名,使用openfeign调用时可以制定服务名称
spring:
application:
name: provider-service
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: 192.168.1.13:8848
namespace: 45b901ff-0a18-44c2-a886-64da03c2f526
group: dev
3、添加ProviderController:
package org.example.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/provider")
public class ProviderController {
@GetMapping("/who/{name}")
public String who(@PathVariable("name") String name){
return name;
}
}
4、 在test项目的Appliction中添加@EnableFeignClients注解。
5、在test项目中添加FeignClient:
package org.example.client;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(name = "provider-service")
public interface ProviderClient {
@GetMapping("/provider/who/{name}")
public String who(@PathVariable("name") String name);
}
6、在TestController中添加openfeign调用方法:
@GetMapping("/who/{name}")
public String who(@PathVariable("name") String name){
return providerClient.who(name);
}
7、启动provider并注册到nacos:
8、重启test-dev,并访问localhost:8081/test/who/zhangsihong,服务调用成功:
问题记录:
1、naos启动集群时总是使用相同的端口号8848:
修改startup.cmd,找到行:
set "NACOS_CONFIG_OPTS=--spring.config.additional-location=optional:%CUSTOM_SEARCH_LOCATIONS%"
修改为(删除optional:):
set "NACOS_CONFIG_OPTS=--spring.config.additional-location=%CUSTOM_SEARCH_LOCATIONS%"
2、服务注册失败
修改applicaiton.yml或bootstrap.yml,nacos的server-addr使用本机ip
服务注册使用的命名空间是id不是名称。