目录
1、简介
上述内容大致意思是:关于eureka 2.0的现有开源工作已经停止。作为2.x分支上现有工作存储库的一部分发布的代码库和工件被视为使用,风险自负。
简单来说就是目前已经闭源
了
不过大家不用惊慌,除了Eureka之外,我们还有更多选择 比如:consul , zookeeper
而在Spring Cloud 中 Consul 使用也较为广泛,Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发。它具有很多优点。包括: 基于 raft 协议,比较简洁; 支持健康检查, 同时支持 HTTP 和 DNS 协议 支持跨数据中心的 WAN 集群 提供图形界面 跨平台,支持 Linux、Mac、Windows
consul是分布式的、高可用、横向扩展的。
consul提供的一些关键特性:
service discovery:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
health checking:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
key/value storage:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。
multi-datacenter:无需复杂的配置,即可支持任意数量的区域。
2、原理
consul是google开源的一个使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如Zookeeper等)。服务部署简单,只有一个可运行的二进制的包。每个节点都需要运行agent,他有两种运行模式server和client。每个数据中心官方建议需要3或5个server节点以保证数据安全,同时保证server-leader的选举能够正确的进行。
可以看出consul的集群是由N个SERVER,加上M个CLIENT组成的。
而不管是SERVER还是CLIENT,都是consul的一个节点,所有的服务都可以注册到这些节点上,正是通过这些节点实现服务注册信息的共享。
CLIENT
CLIENT
表示consul的client模式,就是客户端模式。是consul节点的一种模式,这种模式下,所有注册到当前节点的服务会被转发到SERVER,本身是不持久化这些信息。
SERVER
SERVER
表示consul的server模式,表明这个consul是个server,这种模式下,功能和CLIENT都一样,唯一不同的是,它会把所有的信息持久化的本地,这样遇到故障,信息是可以被保留的。
SERVER-LEADER
中间那个SERVER下面有LEADER
的字眼,表明这个SERVER是它们的老大,它和其它SERVER不一样的一点是,它需要负责同步注册的信息给其它的SERVER,同时也要负责各个节点的健康监测。
其它信息
其它信息
包括它们之间的通信方式,还有一些协议信息,算法。它们是用于保证节点之间的数据同步,实时性要求等等一系列集群问题的解决。
3、安装、配置consul
3.1 安装Consul是非常简单的,首先从 https://www.consul.io/downloads.html 下载对应的安装包,直接解压。
ps: 由于目前我用的是windos操作系统,所以这里我选择的是Windows
3.2 解压好对应的安装包之后,配置Path环境变量
点击进入''我的电脑''之后:
3.3 打开windos命令窗口
输入:consul agent -dev 运行consul
至此consul环境就装配完毕了!
4,创建服务注册:提供者
4.1 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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.czxy</groupId>
<artifactId>consul-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>consul-service</name>
<description>Demo project for Spring Boot</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.M3</spring-cloud.version>
</properties>
<!-- 健康检查/监控包 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- consul基础依赖包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.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>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
4.2 yml配置
server:
port: 8010 #服务端口
spring:
application:
name: consul-service #应用名
cloud:
consul:
host: localhost #consul服务地址
port: 8500 #consul端口
discovery:
serviceName: service-producer #注册到consul的服务名称
4.3 启动类
@SpringBootApplication
@EnableDiscoveryClient //开启注册中心
public class ConsulServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ConsulServiceApplication.class, args);
}
}
4.4 创建controller类 对外提供方法
@RestController
@RequestMapping
public class ProducerController {
@GetMapping("/hello")
public String hello() {
return "hello consul";
}
}
访问:http://localhost:8500/ui/dc1/services
注册成功!
5、创建服务消费者
5.1 消费者pom文件配置与service-pom一致
5.2 创建远程调用配置类
@Configuration
public class Config {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
5.3 创建消费方法,访问serivce
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate restTemplate;
@GetMapping
public String consumer() {
List<ServiceInstance> list = discoveryClient.getInstances("service-producer");
ServiceInstance serviceInstance = list.get(0);
String host = serviceInstance.getHost();
int port = serviceInstance.getPort();
//指定请求地址为提供者
String callServiceResult = restTemplate.getForObject("http://"+host+":"+port+"/hello", String.class);
System.out.println(callServiceResult);
return callServiceResult;
}
}
5.4 yml文件配置
server:
port: 8000
spring:
application:
name: consul-consumer #应用名
cloud:
consul:
host: localhost
port: 8500
discovery:
register: false #设置不需要注册到 consul 中
5、测试
访问:http://localhost:8000/consumer