1. 介绍
1.1 基本介绍
Spring-Cloud Euraka是Spring Cloud集合中一个组件,它是对Euraka的集成,用于服务注册和发现。Eureka是Netflix中的一个开源框架。它和 zookeeper、Consul一样,都是用于服务注册管理的,同样,Spring-Cloud 还集成了Zookeeper和Consul。
在项目中使用Spring Cloud Euraka的原因是它可以利用Spring Cloud Netfilix中其他的组件,如zull等,因为Euraka是属于Netfilix的。
1.2 角色介绍
Eureka由多个instance(服务实例)组成,这些服务实例可以分为两种:Eureka Server和Eureka Client。为了便于理解,我们将Eureka client再分为Service Provider和Service Consumer。
- Eureka Server 提供服务注册和发现
- Service Provider 服务提供方,将自身服务注册到Eureka,从而使服务消费方能够找到
- Service Consumer服务消费方,从Eureka获取注册服务列表,从而能够消费服务
1.3 相关链接
- 官方文档:https://docs.spring.io/spring-cloud-netflix/docs/2.2.8.RELEASE/reference/html/
2. 部署 Eureka Server
2.1 IDEA下maven创建步骤
2.2 pom.xml内容
采用idea快速创建产生的pom.xml的结果文件就是下面的这份,也可以直接拿着这个pom.xml文件直接创建maven项目来达到相同的目的
<?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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.haokeed</groupId>
<artifactId>cloud-eureka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloud-eureka</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR4</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</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>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
2.3 启动类配置
对应的启动类的头部添加对应的@EnableEurekaServer就可以了
package com.haokeed.cloudeureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer // 主要是这行的配置
public class CloudEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(CloudEurekaApplication.class, args);
}
}
可删除mvnw相关文件
mvnw的介绍可以参考:http://www.javacoder.cn/?p=759。
删除文件:.mvn
目录、mvnw
和mvnw.cmd
文件
2.4 配置文件配置
2.4.1 单节点服务
server:
port: 7900
spring:
application:
name: eureka
# eureka集群(>=3节点) 搭建说明=> https://docs.spring.io/spring-cloud-netflix/docs/2.2.8.RELEASE/reference/html/#spring-cloud-eureka-server-peer-awareness
# 注意:单节点,2节点,多节点是不同的搭建方式
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:7900/eureka/
2.4.2 两个节点服务
# 2个节点写法
spring:
application:
# 这个是应用名称
name: eureka
---
spring:
# 表示这个分段的标识,用来区分属于哪个单独实例,在EditConfigures中,Configuration标签中的Active profiles属性
profiles: 7900
server:
port: 7900
eureka:
instance:
hostname: eureka-7900
client:
serviceUrl:
# 2个节点写法,1节点写2节点,2节点写1节点
defaultZone: http://${eureka.instance.hostname}:7901/eureka/
---
spring:
profiles: 7901
server:
port: 7901
eureka:
instance:
hostname: eureka-7901
client:
serviceUrl:
# 2个节点写法,1节点写2节点,2节点写1节点
defaultZone: http://${eureka.instance.hostname}:7900/eureka/
注意
开发启动请参考下方多节点启动方式
2.4.3 多节点集群服务
spring:
application:
name: eureka
eureka:
client:
serviceUrl:
defaultZone: http://localhost:7900/eureka/,http://localhost:7901/eureka/,http://localhost:7902/eureka/
# -- 表示分段写法 ,
---
spring:
# 表示这个分段的标识,用来区分属于哪个单独实例,在EditConfigures中,Configuration标签中的Active profiles属性 对应用
profiles: 7900
server:
port: 7900
eureka:
instance:
# 每个服务实例的主机名
hostname: eureka-7900
---
spring:
profiles: 7901
server:
port: 7901
eureka:
instance:
hostname: eureka-7901
---
spring:
profiles: 7902
server:
port: 7902
eureka:
instance:
hostname: eureka-7902
开发启动配置说明
注意
配置好后,进行启动,前面的几个配置启动会报错,错误是检测不到未启动的配置的连接地址,这个没关系,多个配置全部都启动结束了就不会有错误了。
2.5 admin页面属性
如果是多server启动,每个server都会有对应的这样的管理页面。
3. 部署Eureka Client
- Eureka Client包括两个服务模块:Service Provider(服务提供方)和Service Consumer(服务消费方)。
- Eureka Client和Eureka Server目录类似, 不同点在于:
- 启动类,使用@EnableDiscoveryClient 标识该服务为Euraka Client
- 配置文件,需要指定Euraka Server地址和当前服务注册时的名称。
3.1 部署 Servcie Provider
3.1.1 IDEA下maven创建步骤
3.1.2 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 https://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.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.haokeed</groupId>
<artifactId>eureka-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-client</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR11</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</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>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
3.1.3 启动类配置
package com.haokeed.eurekaclientprovider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient // 相当于启用eureka客户端,默认不填写,也是启用状态的,开发过程中不想启用,可以在配置文件中设置enabled=false
public class EurekaClientProviderApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientProviderApplication.class, args);
}
}
3.1.4 添加提供服务的测试类
package com.haokeed.eurekaclientprovider.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class FirstController {
@RequestMapping("/query")
@ResponseBody
public String query() {
return "hello world";
}
}
3.1.5 配置文件配置
spring:
application:
# 应用名称
# 置在Eureka Server进行注册时,当前服务的名称
name: eureka-client-provider
server:
# 服务应用web访问端口
port: 7800
eureka:
# 作为eureka客户端的配置
client:
# 指定Eureka Server的地址
serviceUrl:
defaultZone: http://localhost:7900/eureka
# 禁用eureka的服务注册等功能,适合开发使用使用
#enabled: false
3.1.6 admin页面查看服务注册结果
3.2 部署 Servcie Customer
工程和前面3.1 部署 Servcie Provider
部署方式一样(3.1.1、3.1.2、3.1.3)。测试的项目名称为eureka-client-customer
3.2.1 IDEA下maven创建步骤
同3.1.1,把项目名称eureka-client-provider=>eureka-client-customer
3.2.2 pom.xml内容
同3.1.2,把项目名称eureka-client-provider=>eureka-client-customer
3.2.3 启动类配置
同3.1.3,把项目名称eureka-client-provider=>eureka-client-customer
3.2.4 添加提供服务的测试类
package com.haokeed.eurekaclientcustomer.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
public class ClientController {
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping("/queryService")
@ResponseBody
public String query() {
//eureka-client-provider就是eureka-client-provider项目中配置文件设定的spring.application.name的值
List<ServiceInstance> instances = discoveryClient.getInstances("eureka-client-provider");
StringBuilder urls = new StringBuilder();
for (ServiceInstance instance : instances) {
urls.append(instance.getHost() + ":" + instance.getPort()).append(",");
}
return "service-client-provider:" + urls.toString();
}
}
3.2.5 配置文件配置
同3.1.5,只改应用名称和端口号
spring:
application:
# 应用名称
# 置在Eureka Server进行注册时,当前服务的名称
name: eureka-client-customer
server:
# 服务应用web访问端口
port: 7700
eureka:
# 作为eureka客户端的配置
client:
# 指定Eureka Server的地址
serviceUrl:
defaultZone: http://localhost:7900/eureka
# 禁用eureka的服务注册等功能,适合开发使用使用
#enabled: false
3.2.6 admin页面查看服务注册结果
3.2.7 查看调用provider结果
3.2.8 问题:关于Servie Customer是否需要在Euraka Server中进行注册呢?
不一定。Service Customer只是从Eureka Serve中获取注册服务的地址信息,如果Service Customer 本身也是一个Service Porvider,那么此时就需要注册服务了。
4.总结
基本搭建功能级是以上的功能,如果还想看更加高阶的细节的东西请看后续
参考文章
http://www.heartthinkdo.com/?p=1933