抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

思维导图

文章已收录Github精选,欢迎Starhttps://github.com/yehongzhi/learningSummary

一、前言

伴随着Eurka2.0版本已停止维护,开始要考虑使用微服务新一代的开源的注册中心替代Eureka。

目前据我了解,Consul和Nacos是比较流行的两种替代方案。这篇文章就介绍一下这两种注册中心在微服务中的简单使用,希望对读者有所帮助。

二、注册中心的作用

注册中心在微服务的架构中相当于一个“服务的通讯录”。当一个服务启动时,需要向注册中心注册服务,注册中心保存了所有服务的服务名称和服务地址的映射关系。当服务A想调用服务D时,则从注册中心获取服务D的服务地址,然后调用。

我画张图给大家描述会更清楚一点,大概如下:

可能会有人问,为什么不直接通过服务地址调用服务D呢,还要从注册中心去获取服务D的服务地址。因为一个服务背后是不止一台机器的,比如服务D可能在实际生产中是由三台机器支持的,对外只暴露一个服务名称,这样可以避免写死服务的IP地址在代码中(写在配置文件里),在服务扩展时就非常方便了。

除了服务注册之外,注册中心还提供服务订阅,当有新的服务注册时,注册中心会实时推送到各个服务。

还有服务健康监测,可以在管理界面看到注册中心中的服务的状态。

三、Consul

由Go语言开发,支持多数据中心分布式高可用的服务发布和服务注册,采用ralt算法保证服务的一致性,且支持健康检查。

3.1 安装(win10版)

第一步,上官网下载安装包。

第二步,解压zip包,并配置环境变量。

第三步,唱跳rap篮球键ctrl+R,cmd,输入命令consul

这就安装成功了,超简单!输入consul -version验证一下,会显示版本号:

第四步,启动。输入命令consul.exe agent -dev本地启动:

第五步,在浏览器中输入http://localhost:8500打开管理界面。

3.2 服务注册

接下来就需要创建两个服务,分别是订单(order)和用户(user),注册到consul。下面我就演示其中一个user服务。

首先创建一个SpringBoot工程,Maven配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<groupId>io.github.yehongzhi</groupId>
<artifactId>user</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency><!-- 健康监测的包 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency><!-- spring-cloud-consul服务治理的jar包 -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

然后yml配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server:
port: 8601
spring:
application:
name: user
cloud:
consul:
port: 8500
host: 127.0.0.1
discovery:
service-name: user
instance-id: ${spring.application.name}:${spring.cloud.consul.host}:${server.port}
health-check-path: /actuator/health
health-check-interval: 10s
prefer-ip-address: true
heartbeat:
enabled: true

在启动类加上开启服务注册的注解:

1
2
3
4
5
6
7
8
@SpringBootApplication
@EnableDiscoveryClient
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}

}

最后启动项目即可,我这里启动两个user,端口号分别是8601,8602:

3.3 服务调用

再创建一个订单项目(order),和user配置类似,注册服务到consul中。

下面演示一下用order服务调用user服务,首先定义user的接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController
@RequestMapping("/mall/user")
public class UserController {
@RequestMapping("/list")
public Map<String, Object> list() throws Exception {
Map<String, Object> userMap = new HashMap<>();
userMap.put("1号佳丽", "李嘉欣");
userMap.put("2号佳丽", "袁咏仪");
userMap.put("3号佳丽", "张敏");
userMap.put("4号佳丽", "张曼玉");
return userMap;
}
}

接着在order服务调用user服务,使用RestTemplate的方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@RestController
@RequestMapping("/mall/order")
public class OrderController {

@Resource
private LoadBalancerClient loadBalancerClient;

@RequestMapping("/callUser")
public String list() throws E