Spring Cloud注册中心 Eureka 入门
作者 | springboot葵花宝典
来源 | 今日头条
1.Spring Cloud Netflix注册中心Eureka入门介绍
Eureka是Sping Cloud Netflix的核心组件,在SpringCloud构架中的作用是实现服务的注册和发现,今天主要介绍Eureka注册中心、客户端搭建。
2.Eureka简介
Eureka Client和Eureka Server是Eureka组件中的两个重要角色,其构架图如下:
从图中我们发现:
- Erueka-Server:用于发现和注册应用服务
- Application-Service:服务的提供者,嵌套Eureka-Client,向Eureka-Server注册自身服务
- Application-Client:服务的消费者,嵌套Eureka-Client,从Eureka-Server获取服务列表
- Make Remote Call:表示远程调用
3.注册中心简介
注册中心是微服务构架的通信录,记录服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用。注册中心一般有三种角色,他们之间相互交互,图如下:
- Service Provider:服务提供者(或Servr)。启动时将自己的IP等信息注册到注册中心
- Service Consumer:服务消费者(或Client)。从注册中心获取提供者的信息
- Registy:注册中心
4.代码实现
我们介绍如何搭建一个Eureka注册中心,具体步骤如下:
1.使用spring-cloud-netflix-eureka-server依赖,搭建Eureka注册中心eureka-registry。
2.搭建一个服务提供者 eureka-provider,注册到注册中心
3.搭建一个消费者eureka-consumer,从注册中心获取eureka-provider的服务列表,现在示例,进行Http远程调用。
4.1搭建注册中心eureka-registry
创建eureka-registry项目,作为注册中心
4.1.1使用IDEA创建SpringCloud
创建SpringCloud就是创建SpingBoot项目,在创建Eureka-registry项目时,需要选择组件如图:
4.1.2 引入依赖
Eureak-registry项目主要依赖了Eureka Server相关依赖,pom.xml文件如下:
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2020.0.1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</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>
通过spring-cloud-starter-netflix-eureka-server 包,引入Eureka Server依赖,实现将Eureka作为注册中心。
4.1.3 application.yml配置文件
创建appliaction.yml,用于添加Eureka相关配置
server:
port: 8800
spring:
application:
name: erueka-registry
eureka:
client:
register-with-eureka: false # 不注册到 Eureka-Server,默认为 true
fetch-registry: false #不从 Eureka-Server 获取注册表,默认为 true
- server.port:设置项目启动端口
- eureka.client:eureka配置项 Eureka Server启动时会启动一个Eureka Client客户端,用于Eureka-Server集群之间的相互请求,因为我们现在搭建的是单节点Eureka-Server,所以register-with-eureka 和 fetch-registry 配置项为 false,不需要相互之间进行注册。
4.1.4 EurekaRegistryApplication
在EurekaRegistryApplication类上添加@EnableEurekaServer(声明其为Eureka-Server服务),将其配置为Eureka注册中心启动类:
@EnableEurekaServer
@SpringBootApplication
public class EruekaRegistryApplication {
public static void main(String[] args) {
SpringApplication.run(EruekaRegistryApplication.class, args);
}
}
4.1.5 测试
通过启动EurekaRegistryApplication类启动注册中心,使用浏览器访问 http://127.0.0.1:8800,可以看到Eureka-Server运维界面,如图:
4.2 搭建Provider(服务提供者)
创建eureka-provider项目作为服务提供者
4.2.1 eureka-provider项目依赖
eureka-provider项目在pom.xml文件中主要引入Eureka Client依赖
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2020.0.1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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>
通过 spring-cloud-starter-netflix-eureka-client 包,引入 Eureka Client 相关依赖,将 Eureka 作为注册中心的客户端,并实现对其的自动配置。
4.2.2 eureka-provider文件配置
在eureka-provider项目的application.yml文件中添加Eureka相关配置:
server:
port: 8810
spring:
application:
name: eureka-provider
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8800/eureka/
- 1.eureka.client.register-with-eureka 为 true,表示将其注册到Eureka-Server注册中心
- eureka.client.fetch-registry 为 true,表示可以从Eureka-Server注册中心拉去注册表,实际在本项目中此处可以设置为false,因为这里只充当服务提供者。
- 3.eureka.client.service-url 配置项,表示Eureka-Server的地址。Eureka具有多Zone的概念,一般不用,因此我们配置defaultZone默认区域为Eureka-Server地址:http://127.0.0.1:8800/eureka/(4.1搭建注册中心的Eureka-Server地址)
4.2.3 服务类添加配置和创建接口以及简单测试
在EurekaProviderApplication启动类上添加注解@EnableDiscoveryClient
1.创建ProviderController类用于提供服务
@RestController
public class ProviderController {
private Logger LOGGER = LoggerFactory.getLogger(this.getClass());
@GetMapping("hello")
public String sayhello(String consumer){
LOGGER.info("操作成功");
return "provider hello:" + consumer;
}
}
2.运行EurekaProviderApplication后,重新打开Eureka运维界面,结果如下:
4.3 搭建Consumer(服务消费者)
创建eureka-consumer项目作为服务消费者
4.3.1 eureka-consumer项目依赖
eureka-consumer项目在pom.xml文件中主要引入Eureka Client依赖
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2020.0.1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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>
4.3.2 eureka-consumer文件配置
在eureka-consumer项目的application.yml文件中添加Eureka相关配置大致和eureka-provider项目配置相同
server:
port: 8820
spring:
application:
name: eureka-consumer
eureka:
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://localhost:8800/eureka/
4.3.3添加配置以及添加消费类
- 在EurekaConsumerApplication添加@EnableDiscoveryClient配置
- 2.创建Config包,用于添加配置类
- 3.创建ConsumerRestTemplateConfiguration配置类
@Configuration
public class ConsumerRestTemplateConfiguration {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
添加控制器
@RestController
public class ConsumerControlle {
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/hello")
public String hello(String name) {
// <1> 获得服务 `eureka-provider` 的一个实例
ServiceInstance instance;
if (true) {
// 获取服务 `demo-provider` 对应的实例列表
List<ServiceInstance> clientInstances = discoveryClient.getInstances("eureka-provider");
// 选择第一个
instance = clientInstances.size() > 0 ? clientInstances.get(0) : null;
} else {
instance = loadBalancerClient.choose("eureka-provider");
}
// <2> 发起调用
if (instance == null) {
throw new IllegalStateException("获取不到实例");
}
String targetUrl = instance.getUri() + "/hello?consumer=" + name;
String response = restTemplate.getForObject(targetUrl, String.class);
// 返回结果
return "consumer:" + response;
}
}
注:
1.RestTemplateConfiguration 配置类,创建 RestTemplate Bean。RestTemplate 是 Spring 提供的 HTTP 调用模板工具类,可以方便我们稍后调用服务提供者的 HTTP API。
4.3.4 测试
运行eureka-consumer后,打开Eureka运维界面,结果如图所示:
访问服务消费者http://127.0.0.1:8820/hello?name=consumer1,返回结果为:"consumer:provider hello:consumer1"。表示远程调用服务提供者成功
总结
今天给Eureka注册中心,主要讲解了Eureka注册中心、Eureka Client(消费者和服务者创建)的搭建过程。