本着趁你病,要你命的宗旨,Spring Cloud Alibaba来了!组件之一Nacos就是用来替代Euraka的,作为注册中心Nacos拥有更强大的功能,使用也更加方便。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<modules>
<module>provider-payment9002</module>
<module>provider-payment9003</module>
<module>consumer-order83</module>
</modules>
<groupId>cn.caiqz</groupId>
<artifactId>cloud2020</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloud2020</name>
<description>Demo project for Spring Boot</description>
<!-- packaging pom 总工程-->
<!--统一管理jar包版本-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<lombok.version>1.18.10</lombok.version>
<log4j.version>1.2.17</log4j.version>
<mysql.version>5.1.47</mysql.version>
<druid.version>1.1.16</druid.version>
<mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
<java.version>1.8</java.version>
</properties>
<!--子模块继承之后,提供作用:锁定版本+子module不用写groupId和version-->
<dependencyManagement><!--定义规范,但不导入-->
<dependencies>
<!--spring boot 统一依赖管理-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba 统一依赖管理-->
<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>
<!--spring cloud 统一依赖管理-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
package cn.caiqz.springcloud.alibaba;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* <p>
* 服务者主启动类
* </p>
*
* @author openshell
* @since 2020-07-04
*/
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9002 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9002.class, args);
}
}
package cn.caiqz.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;
/**
* <p>
* 服务提供
* </p>
*
* @author openshell
* @since 2020-07-04
*/
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id) {
return "nacos registery, serverPort" + serverPort + "\t id=" + id;
}
}
<?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>cloud2020</artifactId>
<groupId>cn.caiqz</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>provider-payment9002</artifactId>
<modelVersion>4.0.0</modelVersion>
<description>
服务提供方1,端口9002
</description>
<dependencies>
<!--引入nacos-->
<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>
<!--引入spring boot web支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot的健康监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
</project>
server:
port: 9002
spring:
application:
name: payment-provider #服务名称,nacos中会显示此名称。
cloud:
nacos:
discovery:
server-addr: 192.168.247.130:8848 #nacos地址
与 子工程——provider-payment9002
除了端口改成9003之外没有其他区别。
server:
port: 9003
spring:
application:
name: payment-provider
cloud:
nacos:
discovery:
server-addr: 192.168.247.130:8848
特别注意服务名要一样,这样才能用nacos做负载。
可以在naocs提供的web界面中看到服务注册情况。
调用服务,nacos默认使用轮询来做负载,所有每次访问的端口会交替。
一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance),CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
C:所有节点在同一时间数据是一致的。
A:系统提供的服务必须一直处于可用状态,对每一个操作的请求必须在有限时间内返回结果。
P:即使分区故障仍要对外提供C+A服务,除非整个网络崩了。
Nacos不仅可以作为服务中心,还能作为配置中心。 同spring cloud一样,在项目初始化时,要保证先从配置中心拉去配置,拉去成功项目才能正确启动。
Spring Boot中配置文件的加载顺序存在优先级,Bootstrap优先级高于application
单节点没啥说的,直接用就行了,可以直接在Nacos的web界面中配置,也可以在使用官方api调用来添加配置。
然后需要改下配文件
https://nacos.io/zh-cn/docs/deployment.html
预计需要1个Nginx+3个Nacos注册中心+1个MySQL。
三个nacos端口: 3333 4444 5555
环境:linux
数据库:提前安装好MySQL,需要执行 nacos 提供的 conf/nacos-mysql.sql 脚本
config-nacos-client3377
pom.xml
<?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>cloud2020</artifactId>
<groupId>cn.caiqz</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>config-nacos-client3377</artifactId>
<dependencies>
<!--nacos-config 配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--引入spring boot web支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot的健康监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
</project>
application.yml
spring:
profiles:
active: dev
bootstrap.yml
server:
port: 3377
spring:
application:
name: config-nacos-client
cloud:
nacos:
discovery:
server-addr: 192.168.247.130:8848 #nacos注册中心地址
config:
server-addr: 192.168.247.130:8848 #nacos配置中心地址
file-extension: yaml
#{spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# config-nacos-client-dev.yml
ConfigClientController
package cn.caiqz.springcloud.alibaba.config;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 测试读取配置中心配置
* </p>
*
* @author openshell
* @since 2020-07-05
*/
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigClientController {
@Value("${useLocalCache:false}")
private String useLocalCache;
@Value("${config.info}")
private String configInfo;
/**
* http://localhost:3377/config/get
*/
@RequestMapping("/get")
public String get() {
return useLocalCache;
}
/**
* http://localhost:3377/config/config/info
* @return
*/
@GetMapping("/info")
public String getConfigInfo(){
return configInfo;
}
}
这儿有个坑就是如果你把配置文件写成 .yml
Nacos就识别不到。。我的版本是1.3.0