1.简介
我们知道微服务系统由很多个服务单元组成,比如一个电商系统平台,可能会把账户业务,会员业务,商品业务,订单业务等业务模块拆解出来作为单独的微服务单元,这些微服务之间互相依赖,且数量越多,管理维护的难度就越大,所以一套微服务系统需要服务注册中心来统一管理微服务单元。
在SpringCloud中,可选择Consul、Zookeeper、Nacos和Eureka作为服务注册和发现的组件,其中Eureka是SpringCloud首选推荐的服务注册和发现组件。本篇博客,将介绍Eureka的使用。
2.代码
本案例有多个Springboot工程,为了便于管理,采用maven多module的结构。最终项目结构如下
| _springcloud1
| _eureka-client
| _eureka-server
| _pom.xml
2.1创建一个父级工程
首先创建一个父maven工程,父maven工程中的src包是没有用的,可以将它删掉,父maven工程的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.czx</groupId>
<artifactId>springcloud1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<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.SR3</spring-cloud.version>
</properties>
<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>
</project>
2.2编写Eureka Server
在父工程下创建一个springboot子模块,命名为eureka-server,这个工程将作为服务注册中心。
eureka-server工程的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.czx</groupId>
<artifactId>springcloud1</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<artifactId>eureka-server</artifactId>
<version>1.0-SNAPSHOT</version>
<name>eureka-server</name>
<description>Demo project for Spring Boot</description>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
使用Spring Initializr方式构建的SpringBoot工程一般在resource目录下会有一个application.properties文件,由于我喜欢用yml文件,所以我会把application.properties文件删掉然后新建一个application.yml。如果目录下同时存在application.yml和application.properties的话,程序启动时会优先读取application.properties,所以properties和yml最好2选1,读者可以自行选择使用properties或者yml。
yml文件中的配置如下
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
#是否将自己这个服务注册到EurekaServer中,由于本应用为注册中心,我们不需要它自己向自己注册,所以设置为false。默认为true
register-with-eureka: false
fetch-registry: false #是否从EurekaServer获取注册信息 默认true 单点的情况下不存在其他的EurkaServer 所以为false
service-url:
default-zone: http://${eureka.instance.hostname}:${server.port}/eureka #注册中心的地址 程序启动后会向这个地址发送http请求,这样一来,注册中心就会知道自己手底下管理这这么一个小弟。 默认为http://localhost:8761/eureka 多个地址使用","分割
在工程的启动类上加上注解@EnableEurekaServer
,开启服务注册中心的功能
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
到这一步Eureka Server的所有搭建工作已经完成了。程序启动起来试试看,
浏览器访问 http://localhost:8761/
界面上的 Instances currently registered with Eureka这一项上没有任何注册的实例,没有是正常的,因为还没有Eureka Client客户端向注册中心Eureka Server注册实例。接下来我们来编写Eureka Client的代码。
2.3编写Eureka Client
在父工程下再创建一个springboot子模块,命名为eureka-client,该工程作为Eureka Client向服务注册中心Eureka Server注册。
eureka-client的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.czx</groupId>
<artifactId>springcloud</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<artifactId>eureka-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-client</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
将eureka-client工程resource目录下的application.properties删掉,新建一个application.yml。yml文件中配置如下
eureka:
client:
service-url:
default-zone: http://localhost:8761/eureka/ #注册中心的地址 程序启动后会向这个地址发送http请求,这样一来,注册中心就会知道自己手底下管理这这么一个小弟。 默认为http://localhost:8761/eureka 多个地址使用","分割
server:
port: 8763
spring:
application:
name: eureka-client
值得一提的是,如果是版本号为Dalston之后的SpringCloud版本,那么就不需要再加@EnableEurekaClient
注解了,只要引入spring-cloud-starter-netflix-eureka-client的起步依赖,工程就会自动作为服务客户端向Eureka Server注册。
到此Eureka Client工程也搭建完了。我们先启动Eureka Server工程,然后启动Eureka Client工程。在浏览器上访问 http://localhost:8761/
在上图中,Instances currently registered with Eureka这一项中已经有一个实例注册上来了,实例名为EUREKA-CLIENT,Status为UP(在线),端口号为8763.这就说明Eureka Client已经成功向Eureka Server注册。
到此,Spring Cloud的服务注册与发现就已经讲完了。但是实际项目中,微服务实例的数量如果较多,有几十甚至上百个的时候,Eureka Server就会承担非常高的负载,那么就需要将其集群化部署。下一篇博客再讲如何搭建高可用的Eureka Server集群。