1 服务治理
微服务架构的特点就是会有非常多的微服务应用,应用之间需要有交互,在应用不多的情况下可以采用静态配置来配置自身需要访问的应用,但是应用多的情况下静态配置会变得非常难以维护,并且随着业务的发展,微服务的应用需要动态扩展,同时集群规模、服务位置、服务命名等都可能发生变化,如果还是通过手工来维护每个应用的配置,极容易发生错误和命名冲突等问题,同时维护这些信息所花费的人工成本也非常之高。为了解决这些问题服务治理就应运而生了,服务治理提供服务注册中心,把所有服务都注册在服务注册中心,也提供服务发现机制,让应用可以通过注册中心获取注册的服务。
2 搭建服务注册中心
2.1 pom文件配置
创建项目springcloud-eureka1项目,spring cloud是基于spring boot的,所以创建项目的时候需要引入spring boot作为父引用,如下所示:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
</parent>
添加公共依赖:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
引入spring-cloud-starter-eureka-server包:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
完成的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>
<groupId>com.springcloud</groupId>
<artifactId>springcloud-eureka1</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2.2 创建启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class RegisterApplication1 {
public static void main(String[] args) {
SpringApplication.run(RegisterApplication1.class,args);
}
}
2.3 创建配置文件
配置文件命名:application.yml。内容配置如下:
#端口号
server:
port: 7001
#Eureka实例名,集群中根据这里相互识别
eureka:
instance:
hostname: eureka
#客户端
client:
#是否开启注册服务,因为这里如果为true表示自己注册自己,而自己就是一个服务注册方,没必要自己注册自己
register-with-eureka: false
#是否拉取服务列表,这里我只提供服务给别的服务。
fetch-registry: false
#注册中心地址
service-url:
defaultZone: http://localhost:7001/eureka/
2.4 启动
启动类RegisterApplication1.java,在浏览器输入http://localhost:7001/eureka/,得到如下界面:
由于没有服务提供者,所以服务列表为空。至此,服务注册中心搭建成功。
3 服务发现与消费
3.1 创建服务提供者
创建项目springcloud-provider1和项目springcloud-provider2,两个项目的pom.xml文件都需要添加eureka客户端依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
两个项目分别创建启动类:
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
添加配置文件,两个项目的的端口不能一样,springcloud-provider1的application.yml配置如下
#端口号
server:
port: 8001
#Eureka实例名,集群中根据这里相互识别
spring:
application:
name: hello-service
eureka:
#客户端
client:
#注册中心地址
service-url:
defaultZone: http://localhost:7001/eureka/
springcloud-provider2的application.yml配置如下
#端口号
server:
port: 8002
#Eureka实例名,集群中根据这里相互识别
spring:
application:
name: hello-service
eureka:
#客户端
client:
#注册中心地址
service-url:
defaultZone: http://localhost:7001/eureka/
3.2 启动验证
运行两个项目的启动类,登录 http://localhost:7001,得到如下所示的服务:
可以看到有两个服务提供者。
4 搭建高可用注册中心
注册中心如果只有一个可能会造成单点的问题,可以创建多个注册中心。创建项目springcloud-eureka2,pom.xml文件配置如下所示:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
application.yml文件配置如下所示:
#端口号
server:
port: 7002
#Eureka实例名,集群中根据这里相互识别
eureka:
instance:
hostname: eureka
#客户端
client:
service-url:
defaultZone: http://localhost:7001/eureka/
server:
#是否开启安全保护,默认是开启的,如果默认开启,注册中心的服务列表就算有些服务断开了,也会继续保存
enable-self-preservation: false
spring:
application:
name: eureka-service
创建启动类RegisterApplication2.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class RegisterApplication2 {
public static void main(String[] args) {
SpringApplication.run(RegisterApplication2.class,args);
}
}
修改springcloud-eureka1的配置文件application.yml
#端口号
server:
port: 7001
#Eureka实例名,集群中根据这里相互识别
eureka:
instance:
hostname: eureka
#客户端
client:
service-url:
defaultZone: http://localhost:7002/eureka/
server:
#是否开启安全保护,默认是开启的,如果默认开启,注册中心的服务列表就算有些服务断开了,也会继续保存
enable-self-preservation: false
spring:
application:
name: eureka-service
启动注册中心springcloud-eureka1、springcloud-eureka2,启动服务提供者springcloud-provider1、springcloud-provider2,登录http://localhost:7001 得到如下所示的注册中心和服务提供者。
有图可以看出服务注册中心相互之间是注册的,每个服务注册中心上注册的服务是共用的。至此,一套高可用的微服务注册中心就搭建完成了。
本文源码下载地址:https://github.com/xiaoyususu/springcloud-eureka-demo.git