Nacos 是阿里巴巴新的开源项目,可以快速实现动态服务发现、服务配置、服务元数据及流量管理。
本篇博客以实现服务注册与发现为主。
在SpringCloud
中也有一个同样优秀的服务注册与发现组件:Eureka,不过已经闭源了,这也是我为什么要学习 Nacos 的原因之一。
如果你也想了解 Eureka,那么请前往:SpringCloud之服务注册与发现Eureka+客户端Feign。个人认为两者的搭建流程和使用思路很相似,
核心的相同之处:
最大的不同之处:
再来说说 Nacos Server 一些其他的重要信息
部署方式: 三种部署模式,分别对应不同的使用场景
启动方式: 两种启动方式,分别对应上面部署方式中的单机模式和集群模式
sh startup.sh -m standalone
cmd startup.cmd
数据源: 两种数据源,分别可以在配置文件中指定
Nacos Server 的版本选择: 目前官网推荐的稳定版本为 1.2.1
GitHub地址:https://github.com/intomylife/SpringCloud
<?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>
<!-- 三坐标 -->
<groupId>com.zwc</groupId>
<artifactId>discovery-commons</artifactId>
<version>1.0.0</version>
<!-- 工程名称和描述 -->
<name>discovery-commons</name>
<description>公用工程</description>
<!-- 打包方式 -->
<packaging>jar</packaging>
<!-- 在 properties 下声明相应的版本信息,然后在 dependency 下引用的时候用 ${} 就可以引入该版本 jar 包了 -->
<properties>
<!-- 编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- jdk -->
<java.version>1.8</java.version>
<!-- SpringBoot -->
<platform-bom.version>Cairo-SR3</platform-bom.version>
<!-- SpringCloud -->
<spring-cloud-dependencies.version>Finchley.SR2</spring-cloud-dependencies.version>
<!-- SpringCloudAlibaba -->
<spring-cloud-alibaba-dependencies.version>2.0.2.RELEASE</spring-cloud-alibaba-dependencies.version>
</properties>
<!-- 加入依赖 -->
<dependencies>
<!-- springboot 起步依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<!-- 排除依赖 -->
<exclusions>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- springboot web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 排除依赖 -->
<exclusions>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- log4j2 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
</dependencies>
<!-- 依赖 jar 包版本管理的管理器 -->
<!-- 如果 dependencies 里的 dependency 自己没有声明 version 元素,那么 maven 就此处来找版本声明。 -->
<!-- 如果有,就会继承它;如果没有就会报错,告诉你没有版本信息 -->
<!-- 优先级:如果 dependencies 里的 dependency 已经声明了版本信息,就不会生效此处的版本信息了 -->
<dependencyManagement>
<dependencies>
<!-- SpringBoot -->
<dependency>
<groupId>io.spring.platform</groupId>
<artifactId>platform-bom</artifactId>
<version>${platform-bom.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- SpringCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud-dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- SpringCloudAlibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba-dependencies.version}</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>
springcloudalibaba-nacos-discovery/discovery-commons/
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
└── main
├── java
│ └── com
│ └── zwc
│ └── core
└── resources
└── application.properties
此工程下有五个模块:
应用名称 | 端口 | 描述 |
---|---|---|
discovery-flyway-service | 8082 | 辅助工程(自动创建数据库和表) |
discovery-master-service | / | 注册中心(这里的注册中心工程其实就是 Nacos 的源码,放入项目中只是为了好找到) |
discovery-provider-first-service | 8090 | 提供者一号服务工程(对外提供服务) |
discovery-provider-second-service | 8091 | 提供者二号服务工程(对外提供服务) |
discovery-consumer-service | 8080 | 消费者服务工程(远程调用服务) |
详细说明:
discovery-flyway-service: 前言中介绍了 Nacos Server 的数据源有两种,这里使用的是MySQL
;而使用MySQL
作为数据源后需要建一些基础表和插入一些基础数据,这时就需要手动操作,然而为了方便,我把这些“枯燥”的操作“简化”了:启动一下项目即可。可能唯一需要注意的就是,我本地的MySQL
账号密码是root, 123456
,如果和你的不一致,那么就在 application.properties 配置文件中更改一下。
discovery-master-service: 此工程中仅仅就复制粘贴了 Nacos Server 的源码,这里放入到项目中为了方便获取是一方面原因;还有另一方面是因为,需要在 Nacos Server 的配置文件中指定MySQL
为数据源,以及配置MySQL
数据库的连接信息,然而为了方便,我已经在 Nacos Server 的源码中改好了这些配置信息。可能唯一需要注意的就是,我本地的MySQL
账号密码是root, 123456
,如果和你的不一致,那么就在 nacos-1.2.1/distribution/conf/application.properties 配置文件中的 25,26 行更改一下。nacos-1.2.1/distribution/conf/application.properties 作为源码构建后的默认配置文件,所以这里先在源码中修改对应的配置信息,从而方便配合在后面使用脚本来快速启动 Nacos Server 服务。
discovery-provider-first-service: 作为提供者,对外提供一个服务,服务的具体内容就是输出一句话和当前服务的端口号。注意两个提供者的应用名称(spring.application.name)完全一致。
discovery-provider-second-service: 作为提供者,对外提供一个服务,服务的具体内容就是输出一句话和当前服务的端口号。注意两个提供者的应用名称(spring.application.name)完全一致。
discovery-consumer-service: 作为消费者,来远程调用服务,也就是调用上面的两个提供者提供的服务。
其他补充说明:
<?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>
<!-- 继承父 -->
<parent>
<groupId>com.zwc</groupId>
<artifactId>discovery-service</artifactId>
<version>1.0.0</version>
</parent>
<!-- 三坐标 -->
<groupId>com.zwc</groupId>
<artifactId>discovery-flyway-service</artifactId>
<version>1.0.0</version>
<!-- 工程名称描述 -->
<name>discovery-flyway-service</name>
<description>辅助工程(自动创建数据库和表)</description>
<!-- 打包方式 -->
<packaging>jar</packaging>
<!-- 在 properties 下声明相应的版本信息,然后在 dependency 下引用的时候用 ${} 就可以引入该版本 jar 包了 -->
<properties>
<!-- ali 连接池 -->
<druid.version>1.1.9</druid.version>
</properties>
<!-- 加入依赖 -->
<dependencies>
<!-- 数据库访问依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- mysql 依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- ali 连接池依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- 数据库版本管理 依赖 -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
</dependencies>
<!-- 插件依赖 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
数据库
和flyway
相关依赖# 端口
server.port=8082
# 数据源
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/nacos_config?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=PRC&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
## flyway 注:可以完全不用配置
### sql 脚本的位置,默认为 classpath:db/migration。可手动指定
#spring.flyway.locations=classpath:db/migration
### 指定数据源,如果没有指定的话,将使用配置的主数据源
#spring.flyway.url=jdbc:mysql://127.0.0.1:3306/nacos_config?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=PRC&useSSL=false
### Flyway 管理的 Schema 列表,区分大小写。默认连接对应的默认 Schema
### 如果这里明确指定了库名,那么在 spring.flyway.url 连接中指定的库名将无效
#spring.flyway.schemas=nacos_config
### 用户名
#spring.flyway.user=root
### 密码
#spring.flyway.password=123456
### 开启,默认开启
#spring.flyway.enabled=true
flyway
默认会取数据源的配置信息,所以这里关于flyway
的配置全部注释,主要为了如果是使用我的源代码测试,数据源的信息可以少改一个地方,我的本地MySQL
密码是 123456,大家可能和我不一样package com.zwc.flyway.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @ClassName InitDatabaseConfig
* @Desc TODO 自动创建数据库
* @Date 2020/6/21 8:38 PM
* @Version 1.0
*/
@Configuration
public class InitDatabaseConfig {
private static final Logger LOGGER = LoggerFactory.getLogger(InitDatabaseConfig.class);
/**
* 读取配置文件中数据库的连接信息
*/
/**
* 驱动名称
*/
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
/**
* 地址
*/
@Value("${spring.datasource.url}")
private String url;
/**
* 用户名
*/
@Value("${spring.datasource.username}")
private String username;
/**
* 密码
*/
@Value("${spring.datasource.password}")
private String password;
/*
* @ClassName InitDatabaseConfig
* @Desc TODO 创建数据库
* @Date 2020/6/22 8:58 AM
* @Version 1.0
*/
@Bean(name = "dataSource")
public DataSource dataSource() {
LOGGER.info("==================================== InitDatabaseConfig -> dataSource -> 开始创建数据库 ====================================");
// 数据库连接对象
Connection connection = null;
Statement statement = null;
try {
// 如果尝试去连接不存在的数据库会报错,所以这里连接的时候不带数据库名称
String connectionUrl = url.replace(("/" + (url.substring(0, url.indexOf("?"))).substring(((url.substring(0, url.indexOf("?"))).lastIndexOf("/")) + 1)), "");
// 从连接地址中截取出数据库名称
String databaseName = (url.substring(0, url.indexOf("?"))).substring(((url.substring(0, url.indexOf("?"))).lastIndexOf("/")) + 1);
// 设置驱动
Class.forName(driverClassName);
// 连接数据库
connection = DriverManager.getConnection(connectionUrl, username, password);
statement = connection.createStatement();
// 创建数据库
statement.executeUpdate("create database if not exists `" + databaseName + "` default character set utf8mb4 COLLATE utf8mb4_general_ci");
}catch (Exception e) {
e.printStackTrace();
LOGGER.info("==================================== InitDatabaseConfig -> dataSource -> 创建数据库出错:" + e.getMessage() + " ====================================");
}finally {
try {
// 关闭连接
statement.close();
connection.close();
}catch (SQLException e) {
LOGGER.info("==================================== InitDatabaseConfig -> dataSource -> 关闭数据库出错:" + e.getMessage() + " ====================================");
}
LOGGER.info("==================================== InitDatabaseConfig -> dataSource -> 创建数据库结束 ====================================");
}
// 创建数据源
DruidDataSource druidDataSource = new DruidDataSource();
// 设置数据源
druidDataSource.setDriverClassName(driverClassName);
druidDataSource.setUrl(url);
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
// 返回数据源
return druidDataSource;
}
}
@Configuration
标注自定义配置类,在应用上下文加载时初始化由于引入了flyway-core
依赖,所以只需要把初始化 sql 放在 flyway 默认会去读取的db/migration
目录中,就可以了。具体内容可在源码中查看,就不粘贴出来占篇幅了。
2020-07-04 18:35:34.120 INFO 2036 --- [ main] c.zwc.flyway.config.InitDatabaseConfig : ==================================== InitDatabaseConfig -> dataSource -> 开始创建数据库 ====================================
2020-07-04 18:35:34.347 INFO 2036 --- [ main] c.zwc.flyway.config.InitDatabaseConfig : ==================================== InitDatabaseConfig -> dataSource -> 创建数据库结束 ====================================
MySQL
图形化连接工具中刷新本地库,发现多了一个nacos_config
数据库,打开数据库,可以看到一些基础表已经被自动创建出来了此工程中只有 Nacos Server 的源码,就没有太多搭建上的说明,唯一需要注意的就是上面提到过的数据库连接账号密码,如果你的不是root, 123456
,那么就去修改一下。
但是此处需要着重说明的是如何快速构建这个源码,当然,Nacos 官方文档中已经写的很详细了,这里就锦上添花一波,把一些命令再“封装”一下,达到一行命令就能快速启动 Nacos Server 服务的效果。
这里分别为本地快速开发测试以及日常使用两种不同的场景编写了脚本,放在了项目的 script 目录中
springcloudalibaba-nacos-discovery/
├── discovery-commons
├── discovery-service
└── script
├── daily-use
│ ├── nacos-start.sh
│ └── nacos-stop.sh
└── quick-start
├── nacos-install.bat
├── nacos-install.sh
├── nacos-start.bat
├── nacos-start.sh
├── nacos-stop.bat
└── nacos-stop.sh
quick-start 目录 - 快速开始:
IDEA
打开 springcloudalibaba-nacos-discovery 项目IDEA
底部的Terminal
终端入口MacBook-Pro:springcloudalibaba-nacos-discovery zouwencong$ pwd
/Users/zouwencong/JavaWork/my_spring_cloud/SpringCloud/springcloudalibaba-nacos-discovery
MacBook-Pro:springcloudalibaba-nacos-discovery zouwencong$ ls -all
total 32
drwxr-xr-x 7 zouwencong staff 224 Jun 25 21:57 .
drwxr-xr-x 18 zouwencong staff 576 Jul 3 13:54 ..
-rw-r--r--@ 1 zouwencong staff 12292 Jul 2 09:47 .DS_Store
drwxr-xr-x 10 zouwencong staff 320 Jul 4 18:58 .idea
drwxr-xr-x 11 zouwencong staff 352 Jun 28 16:08 discovery-commons
drwxr-xr-x 14 zouwencong staff 448 Jul 2 16:41 discovery-service
drwxr-xr-x 5 zouwencong staff 160 Jun 22 17:51 script
MacBook-Pro:springcloudalibaba-nacos-discovery zouwencong$
Mac
用户,先输入命令chmod +x script/quick-start/nacos-install.sh
,然后再输入命令./script/quick-start/nacos-install.sh
Windows
用户,输入命令script\quick-start\nacos-install.bat
Maven
中去下载SpringCloudAlibaba
的相关依赖Mac
用户,执行完对应命令后会有如下日志(截取最后关键部分):...省略部分...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 38.467 s
[INFO] Finished at: 2020-07-04T19:42:13+08:00
[INFO] Final Memory: 110M/1588M
[INFO] ------------------------------------------------------------------------
...省略部分...
nacos is starting with standalone
nacos is starting,you can check the /Users/zouwencong/Downloads/SpringCloud-master/springcloudalibaba-nacos-discovery/discovery-service/discovery-master-service/nacos-1.2.1/distribution/target/naco-server-1.2.1/nacos/logs/start.out
[INFO] ----------------------------- end --------------------------------------
Windows
用户,执行完对应的命令后会有如下日志(截取最后关键部分):...省略部分...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:18 min
[INFO] Finished at: 2020-07-04T19:52:11+08:00
[INFO] ------------------------------------------------------------------------
...省略部分...
2020-07-04 19:52:22,620 INFO Nacos started successfully in stand alone mode.
2020-07-04 19:52:22,857 INFO Initializing Servlet 'dispatcherServlet'
2020-07-04 19:52:22,865 INFO Completed initialization in 7 ms
nacos
, nacos
Mac
用户,先输入命令chmod +x script/quick-start/nacos-stop.sh
,然后再输入命令./script/quick-start/nacos-stop.sh
Windows
用户,发现当前Terminal
框并没有可输入的地方了,所以这里想停止的话就先点击+ (New Session)
按钮,然后再输入命令script\quick-start\nacos-stop.bat
Mac
用户,先输入命令chmod +x script/quick-start/nacos-start.sh
,然后再输入命令./script/quick-start/nacos-start.sh
Windows
用户,输入命令script\quick-start\nacos-start.bat
daily-use 目录 - 日常使用:
我们可能以后项目中经常会用到 Nacos Server 服务,就像Redis
、MySQL
一样,当做一个服务来启动,那么就先把刚刚编译构建后的目录(discovery-master-service/nacos-1.2.1/distribution/target/nacos-server-1.2.1/nacos)复制到本地。由于是作为日常使用的服务,所以再来设置一下日志目录
server.tomcat.basedir
由于Windows
中启动 Nacos Server 不需要指定参数,所以在刚刚复制目录(discovery-master-service/nacos-1.2.1/distribution/target/nacos-server-1.2.1/nacos)下的 bin 目录中的 .bat 脚本可以直接双击使用;而Mac
中为了方便,这里也写了一个日常使用的脚本,如何使用
script/daily-use/nacos-start.sh
脚本文件和 script/daily-use/nacos-stop.sh
脚本文件到桌面chmod +x nacos-start.sh
,chmod +x nacos-stop.sh
nacos-start.sh
文件打开方式
->其他...
所有应用程序
始终以此方式打开
实用工具
终端
nacos-stop.sh
也同样设置一遍nacos-start.sh
-> 第 20 行
nacos-stop.sh
-> 第 8 行
<?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>
<!-- 继承父 -->
<parent>
<groupId>com.zwc</groupId>
<artifactId>discovery-provider-first-service</artifactId>
<version>1.0.0</version>
</parent>
<!-- 三坐标 -->
<groupId>com.zwc</groupId>
<artifactId>discovery-provider-first-service-core</artifactId>
<version>1.0.0</version>
<!-- 工程名称描述 -->
<name>discovery-provider-first-service-core</name>
<description>提供者一号服务工程 - 核心</description>
<!-- 打包方式 -->
<packaging>jar</packaging>
<!-- 在 properties下声明相应的版本信息,然后在dependency下引用的时候用 ${} 就可以引入该版本jar包了 -->
<properties>
</properties>
<!-- 加入依赖 -->
<dependencies>
<!-- commons 工程依赖 -->
<dependency>
<groupId>com.zwc</groupId>
<artifactId>discovery-commons</artifactId>
<version>1.0.0</version>
</dependency>
<!-- api 工程依赖 -->
<dependency>
<groupId>com.zwc</groupId>
<artifactId>discovery-provider-first-service-api</artifactId>
<version>1.0.0</version>
</dependency>
<!-- 提供者消费者 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<!-- 插件依赖 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
# 端口
server:
port: 8090
spring:
application:
# 应用名称
name: say-hello
cloud:
nacos:
discovery:
# 注册中心地址
server-addr: 127.0.0.1:8848
# 用户名
username: nacos
# 密码
password: nacos
package com.zwc.first.api;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName SayHelloController
* @Desc TODO Say Hello
* @Date 2019/5/15 15:28
* @Version 1.0
*/
@RestController
public class SayHelloController {
/*
* @ClassName SayHelloController
* @Desc TODO 读取配置文件中的端口
* @Date 2019/5/15 15:49
* @Version 1.0
*/
@Value("${server.port}")
private String port;
/*
* @ClassName SayHelloController
* @Desc TODO Say Hello
* @Date 2019/5/15 15:30
* @Version 1.0
*/
@RequestMapping("/hello")
public String hello(){
return "Hello Spring Cloud Alibaba!!! port:" + port;
}
}
package com.zwc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class DiscoveryProviderFirstServiceCoreApplication {
public static void main(String[] args) {
SpringApplication.run(DiscoveryProviderFirstServiceCoreApplication.class, args);
}
}
Hello Spring Cloud Alibaba!!! port:8090
服务名 | 分组名称 | 集群数目 | 实例数 | 健康实例数 | 触发保护阈值 | 操作 |
---|---|---|---|---|---|---|
say-hello | DEFAULT_GROUP | 1 | 1 | 1 | false | 详情 | 示例代码 | 删除 |
Hello Spring Cloud Alibaba!!! port:8091
服务名 | 分组名称 | 集群数目 | 实例数 | 健康实例数 | 触发保护阈值 | 操作 |
---|---|---|---|---|---|---|
say-hello | DEFAULT_GROUP | 1 | 2 | 2 | false | 详情 | 示例代码 | 删除 |
<?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>
<!-- 继承父 -->
<parent>
<groupId>com.zwc</groupId>
<artifactId>discovery-consumer-service</artifactId>
<version>1.0.0</version>
</parent>
<!-- 三坐标 -->
<groupId>com.zwc</groupId>
<artifactId>discovery-consumer-service-core</artifactId>
<version>1.0.0</version>
<!-- 工程名称描述 -->
<name>discovery-consumer-service-core</name>
<description>消费者服务工程 - 核心</description>
<!-- 打包方式 -->
<packaging>jar</packaging>
<!-- 在 properties下声明相应的版本信息,然后在dependency下引用的时候用 ${} 就可以引入该版本jar包了 -->
<properties>
</properties>
<!-- 加入依赖 -->
<dependencies>
<!-- commons 工程依赖 -->
<dependency>
<groupId>com.zwc</groupId>
<artifactId>discovery-commons</artifactId>
<version>1.0.0</version>
</dependency>
<!-- api 工程依赖 -->
<dependency>
<groupId>com.zwc</groupId>
<artifactId>discovery-consumer-service-api</artifactId>
<version>1.0.0</version>
</dependency>
<!-- 提供者消费者 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
<!-- 插件依赖 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
# 端口
server:
port: 8080
spring:
application:
# 应用名称
name: service-feign
cloud:
nacos:
discovery:
# 注册中心地址
server-addr: 127.0.0.1:8848
# 用户名
username: nacos
# 密码
password: nacos
# 开启断路器
feign:
hystrix:
enabled: true
package com.zwc.consumer.feign;
import com.zwc.consumer.feign.fallback.FeignApiFallBack;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @ClassName FeignApi
* @Desc TODO 使用 Feign 调用 Api - 接口
* @Date 2019/5/15 16:11
* @Version 1.0
*/
@FeignClient(value = "say-hello", fallback = FeignApiFallBack.class)
public interface FeignApi {
/*
* @ClassName FeignApi
* @Desc TODO 调用远程 hello() 方法
* @Date 2019/5/15 16:17
* @Version 1.0
*/
@RequestMapping("/hello")
String hello();
}
package com.zwc.consumer.feign.fallback;
import com.zwc.consumer.feign.FeignApi;
import org.springframework.stereotype.Component;
/*
* @ClassName FeignApi
* @Desc TODO fallback
* @Date 2019/5/20 23:21
* @Version 1.0
*/
@Component
public class FeignApiFallBack implements FeignApi {
/*
* @ClassName FeignApiFallBack
* @Desc TODO 调用远程 hello() 方法失败时执行
* @Date 2019/5/20 23:31
* @Version 1.0
*/
@Override
public String hello() {
return "Oh! Call say-hello fail.";
}
}
package com.zwc.consumer.controller;
import com.zwc.consumer.feign.FeignApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName FeignController
* @Desc TODO 使用 Feign 调用 Api - 前端控制器
* @Date 2019/5/15 16:18
* @Version 1.0
*/
@RestController
public class FeignController {
@Autowired(required = false)
private FeignApi feignApi;
/*
* @ClassName FeignController
* @Desc TODO 调用远程 hello() 方法
* @Date 2019/5/15 16:20
* @Version 1.0
*/
@RequestMapping("/feign")
public String feign(){
return feignApi.hello();
}
}
package com.zwc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class DiscoveryConsumerServiceCoreApplication {
public static void main(String[] args) {
SpringApplication.run(DiscoveryConsumerServiceCoreApplication.class, args);
}
}
Hello Spring Cloud Alibaba!!! port:8090
和Hello Spring Cloud Alibaba!!! port:8091
服务名 | 分组名称 | 集群数目 | 实例数 | 健康实例数 | 触发保护阈值 | 操作 |
---|---|---|---|---|---|---|
service-feign | DEFAULT_GROUP | 1 | 1 | 1 | false | 详情 | 示例代码 | 删除 |
say-hello | DEFAULT_GROUP | 1 | 2 | 2 | false | 详情 | 示例代码 | 删除 |
springcloudalibaba-nacos-discovery/discovery-service/
├── discovery-consumer-service
│ ├── discovery-consumer-service-api
│ ├── discovery-consumer-service-core
│ ├── mvnw
│ ├── mvnw.cmd
│ └── pom.xml
├── discovery-flyway-service
│ ├── mvnw
│ ├── mvnw.cmd
│ ├── pom.xml
│ └── src
├── discovery-master-service
│ ├── mvnw
│ ├── mvnw.cmd
│ ├── nacos-1.2.1
│ └── pom.xml
├── discovery-provider-first-service
│ ├── discovery-provider-first-service-api
│ ├── discovery-provider-first-service-core
│ ├── mvnw
│ ├── mvnw.cmd
│ └── pom.xml
├── discovery-provider-second-service
│ ├── discovery-provider-second-service-api
│ ├── discovery-provider-second-service-core
│ ├── mvnw
│ ├── mvnw.cmd
│ └── pom.xml
├── mvnw
├── mvnw.cmd
└── pom.xml
希望能够帮助到你
over