背景
早期我们的应用将所有的功能都集中到一个项目中,也叫做单体应用或者单个服务,单体应用会出现一个功能出现问题会影响整个项目的问题,也不方便进行扩展,比如我们修改某块功能,需要更新整个项目。进而延伸出了微服务,将原来的功能模块进行整合,形成一个个独立的服务,这样某个功能模块的修改只会影响自己的服务,对其它服务影响较小,对整个项目产生的影响也比较小。这样将多个功能模块拆成多个微服务以后,各个微服务之间会存在相互的调用和配合,如果直接将服务调用地址写死在项目中,后续不方便维护,所以就出现了针对微服务治理的各个组件,Eureka就是其中的一个组件。
1.Eureka是什么?
Eureka是springCloud体系下的一个组件,负责服务的注册和发现,分为服务端和客户端。
服务的注册:各个微服务将自己的调用地址和调用方式注册到Eureka服务端。
服务的发现:当某个微服务需要另一个微服务的功能时,可以通过Eureka客户端链接Eureka服务端寻找自己需要的服务地址,Eureka服务端通过心跳机制负责管理着各个注册后的客户端信息。
2.实现一个简单的Eureka Server
创建SpringBoot项目,引入Eureka Server依赖(主要是spring-cloud-starter-netflix-eureka-server)
<?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.4.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.eureka</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>server</name>
<description>Demo project for Spring Boot</description>
<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.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>
</project>
在启动类上添加注解,启动EurekaServer端
package com.example.eureka.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class ServerApplication { public static void main(String[] args) { SpringApplication.run(ServerApplication.class, args); } }
EurekaServer也是一个服务,我们需要针对这个服务做一些基本的配置,包括端口号,服务名,地址等等
#服务端口(Spring的配置) server.port=8080 #服务名称(Spring的配置) spring.application.name=eureka-server #服务地址 eureka.instance.hostname=127.0.0.1 #不向注册中心注册自己(服务端不需要将自己注册到服务端) eureka.client.register-with-eureka=false #取消检索服务(服务端不需要进行检索服务) eureka.client.fetch-registry=false #注册中心路径 eureka.client.service-url.default-zone=http://${eureka.instance.hostname}:${server.port}/eureka
正常启动服务
2021-03-14 23:43:58.014 INFO 16464 --- [)-192.168.137.1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-03-14 23:43:58.014 INFO 16464 --- [)-192.168.137.1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2021-03-14 23:43:58.016 INFO 16464 --- [)-192.168.137.1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms
2021-03-14 23:44:55.781 INFO 16464 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry : Running the evict task with compensationTime 0ms
2021-03-14 23:45:55.781 INFO 16464 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry : Running the evict task with compensationTime 0ms
2021-03-14 23:46:55.782 INFO 16464 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry : Running the evict task with compensationTime 0ms
2021-03-14 23:47:55.783 INFO 16464 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry : Running the evict task with compensationTime 0ms
2021-03-14 23:48:55.783 INFO 16464 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry : Running the evict task with compensationTime 0ms
打开浏览器访问http://127.0.0.1:8080/,一个简单的Enreka启动成功,红色内容为服务端的自我保护,暂时不用管,后续会进行说明。

2.实现一个简单的Eureka Client 并注册到server端
创建SpringBoot项目,引入Eureka Client依赖
<?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.4.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.client</groupId>
<artifactId>eurekaclient</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eurekaclient</name>
<description>Demo project for Spring Boot</description>
<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-client</artifactId>
<version>3.0.1</version>
</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>
</plugin>
</plugins>
</build>
</project>
启动类添加client的注解,启动Eureka
package com.client.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
配置客户端信息
#服务端口 server.port=8001 #服务名称 spring.application.name=clientOne #服务地址 eureka.instance.hostname=127.0.0.1 #注册中心路径 eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8080/eureka
启动客户端,这样一个简单的客户端搭建完成了。
查看server端的网页,会发现client已经注册到了服务端。
以上仅仅是服务端和客户端的简单搭建,后续会详细说明服务端和客户端的其它配置,以及多个客户端之间如何调用。