B站尚硅谷P95~P110
代码Gitee地址
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
注册中心和配置中心的组合。
直接使用docker安装:
docker pull nacos/nacos-server:1.1.4
docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server:1.1.4
访问:http://localhost:8848/nacos/index.html,出现如下界面,默认用户名和密码都是nacos
。
分别新建module:cloudalibaba-provider-payment9001
和9002、9003;
依赖:
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.62version>
dependency>
dependencies>
配置文件:记得三个提供者端口不同。
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
#端口暴漏
management:
endpoints:
web:
exposure:
include: '*'
主启动类:记得不同提供者类名不同。
@SpringBootApplication
@EnableDiscoveryClient
public class NacosMain9001 {
public static void main(String[] args) {
SpringApplication.run(NacosMain9001.class,args);
}
}
业务类:
@RestController
@RequestMapping("payment")
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id) {
return "serverPort: " + serverPort + "\t id:" + id;
}
}
新建module:cloudalibaba-consumer-order83
;
依赖:
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
配置文件:
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
service-url:
nacos-user-service: http://nacos-payment-provider
配置RestTemplate
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
启动类:
@EnableDiscoveryClient
@SpringBootApplication
public class NacosOrderMain83 {
public static void main(String[] args) {
SpringApplication.run(NacosOrderMain83.class, args);
}
}
业务类:
@Slf4j
@RestController
@RequestMapping("/consumer")
public class OrderController {
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serverURL;
@GetMapping(value = "/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id) {
return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class);
}
}
nacos可以实现ap和cp的切换。
ip:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP
,必须是put类型请求。直接将配置写入nacos中。
新建module:cloudalibaba-config-client3377
依赖:
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
配置:
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #服务注册中心地址
config:
server-addr: localhost:8848 #配置中心地址
file-extension: yaml #指定yaml格式的配置
spring:
profiles:
active: dev # 指定环境
Nacos配置规则,参考如下图中,可以看出我们指定的服务名称+环境+后缀结合后,配置文件(dataId)应该是:nacos-config-client-dev.yaml
类似于Java的包名和类名,最外层namespeace可以用于区分部署环境,group和dataId逻辑上区分两个目标对象。
指定
spring.profiles.active
来配置不同的环境,读取不同的配置文件。
在默认的namespace和默认的group下额外新建一个dataId为nacos-config-client-test.yaml
的配置文件。
修改本地3377的application.yml:
spring:
profiles:
active: test # 对应当前环境
在3377的bootstrap.yml
下指定组来获取(默认为默认组):
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: ip:8848 #服务注册中心地址
config:
server-addr: ip:8848 #配置中心地址
file-extension: yaml #指定yaml格式的配置
group: TEST_GROUP
修改application.yml
:
spring:
profiles:
active: info # 对应当前环境
修改3377的bootstrap.yml
:
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: 49.232.141.194:8848 #服务注册中心地址
config:
server-addr: 49.232.141.194:8848 #配置中心地址
file-extension: yaml #指定yaml格式的配置
namespace: 4a2dfb5f-c3e6-481b-974a-671ddfd39734 # 对应命名空间的编号
group: TEST_GROUP
省流,这部分出问题了,建议忽略。
这里的vip指的是虚拟ip,即nginx;且官网要求需要对nacos进行持久化,支持的是使用MySQL来实现(默认内部有一个derby数据库,但是多个nacos节点数据存储存在一致性的问题)。
因此实际上的架构图应该是这样:
省流,这里错了。
由于之前使用docker运行nacos容器时,没有指定配置文件等信息,这里重新配置一下。
删除原先的nacos容器:
# 暂停
docker stop nacos
# 删除
docker rm nacos
创建本地挂载目录:
mkdir -p /home/docker/nacos/conf/
touch application.properties
mkdir -p /home/docker/nacos/logs
修改:application.properties
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.xx.xx:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=Asia/Shanghai
db.user=root
db.password=123456
在数据库中新建nacos库:并执行:sql文件
启动nacos:
docker run \
--name nacos -d \
-p 8848:8848 \
--privileged=true \
--restart=always \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
-e MODE=standalone \
-e PREFER_HOST_MODE=hostname \
-v /home/docker/nacos/logs:/home/nacos/logs \
-v /home/docker/nacos/conf/application.properties:/home/nacos/conf/application.properties \
nacos/nacos-server
参考地址:使用docker安装nacos并配置mysql8.0
由于无法实现三台虚拟机,鸽了。