上一篇:SpringCloud 教程(一)| 微服务及五大神兽组件 --- 微服务架构
一、简介。
Eureka 是 Netflix开源 的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现。也是springcloud体系中最重要最核心的组件之一。通过一些简单的注解,开发者就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。管理的服务包含了Spring Cloud的其他服务组件如:熔断、负载、降级等。
以往服务间资源的获取都是通过相互调用,比如A获取B相关资源,A调用B提供的API获取相关资源 。加入Eureka之后,则B提供服务资源需要在Eureka服务中心注册一遍,A获取服务资源也需要在Eureka服务中心注册一遍,从而获取B服务的资源。监控Eureka服务中心可以监控AB服务调用的使用情况。
如果对springboot 不了解,可能会有一些吃力。
eureka 官网: https://www.eurekanetwork.org/
如果所有的后端微服务之间,没有互相通信,那么eureka是可以不要的。
如果后端微服务之间,有互相通信,那么在负载均衡时,相同的服务肯定会启动多个,而且使用不同的端口,这个时候,服务之间就可以通过注册在eureka中的名称来找到对方,而不是根据IP+端口号去找对方。
如果后端微服务之间相互通信,都要知道具体的IP和端口,那开发要怎么干?
Eureka包含两个组件:Eureka Server和Eureka Client。
- Eureka Server提供服务发现的能力,各个微服务启动时,会向Eureka Server注册自己的信息(例如IP、端口、微服务名等),Eureka Server会存储这些信息。
- Eureka Client是一个Java客户端,用于简化与Eureka Server的交互。
- 微服务启动后,会周期性(默认30s)向Eureka Server发送心跳以续约自己的“租期”。
- 如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90s)。
- 默认情况下,Eureka Server同时也是Eureka Client。多个Eureka Server实例,互相之间通过复制的方式,来实现服务注册表中数据的同步。
- Eureka Client会缓存服务注册表中的信息。这种方式有一定的优势 —— 首先,微服务无须每次都查询Eureka Server,从而降低了Eureka Server的压力;其次,即时Eureka Server所有节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者并完成调用。
综上,Eureka通过心跳检查、客户端缓存等机制,提供了系统的灵活性、可伸缩性和可用性。
需要指明spring.application.name,这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name
二、创建 eureka 服务注册中心。
2.1 创建一个 父 maven.
下面几篇教程都是以此为基础 , maven 引入 相应的 pom 依赖,这个 父 pom 主要作用是起到版本控制作用,spring Boot版本为2.0.3.RELEASE,Spring Cloud版本为Finchley.RELEASE。
代码如下:
<?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>cn.wbw</groupId> <artifactId>wbw-spring-cloud</artifactId> <version>1.0-SNAPSHOT</version> <!-- 打包方式,项目的打包类型:pom、jar、war packing默认是jar类型, <packaging>pom</packaging> 父类型都为pom类型 <<packaging>jar</packaging> 内部调用或者是作服务使用,通常单个springboot 都会打此包 <<packaging>war</packaging> 需要部署的项目 --> <packaging>pom</packaging> <name>wbw-spring-cloud</name> <description>spring cloud 父级工程,maven 管理</description> <!-- SpringBoot 依赖 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> <relativePath/> </parent> <!-- 下级模块管理 --> <modules> <module>eureka-server</module> <module>eureka-service-hi</module> </modules> <properties> <!-- 项目 jdk 环境 及 项目编码统一 --> <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>Finchley.RELEASE</spring-cloud.version> </properties> <!-- dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管理器pom.xml文件中, jar的版本判断的两种途径 1:如果dependencies里的dependency自己没有声明version元素,那么maven就 会倒dependencyManagement里面去找有没有对该artifactId和groupId进行过版本声明,如果有,就继承它,如果 没有就会报错,告诉你必须为dependency声明一个version 2:如果dependencies中的dependency声明了version, 那么无论dependencyManagement中有无对该jar的version声明,都以dependency里的version为准。 --> <dependencyManagement> <dependencies> <!-- SpringCloud 核心依赖--> <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> <dependencies> <!-- 测试环境所需依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <!-- Spring Boot的Maven插件(Spring Boot Maven plugin)能够以Maven的方式为应用提供Spring Boot的支持, 即为Spring Boot应用提供了执行Maven操作的可能。 Spring Boot Maven plugin能够将Spring Boot应用打包为可执行的jar或war文件, 然后以通常的方式运行Spring Boot应用。 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2.2 创建 子模块 eureka-server 的 springboot 程序。
下一步 选择 springboot 程序。
下一步,选择如图:
点击 Finish 完成即可。
2.3 修改 eureka-server pom 文件。
pom 文件 引入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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 父级maven 依赖--> <parent> <groupId>cn.wbw</groupId> <artifactId>wbw-spring-cloud</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>eureka-server</artifactId> <version>0.0.1-SNAPSHOT</version> <name>eureka-server</name> <description>eureka 服务注册中心</description> <dependencies> <!-- Eureka是Netflix开源的服务发现组件,本身是一个基于REST的服务。 它包含Server和Client两部分。Spring Cloud将它集成在子项目Spring Cloud Netflix中,从而实现微服务的注册与发现。 Eureka包含两个组件:Eureka Server和Eureka Client。 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> </project>
2.4 配置 启动 服务注册中心。
在 Application 添加 注解@EnableEurekaServer。
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; /** * Eureka服务注册中心 * <p> * 在这里 @SpringBootApplication 相当于 : * 注解 @Configuration(替代相应的xml配置文件) * 注解 @EnableAutoConfiguration(自动配置spring的上下文) * 注解 @ComponentScan (自动扫描指定包下的全部标有@Component的类, * 并注册成bean,当然包括@Component下的子注解@Service,@Repository,@Controller。) * </p> * <p> * 通过 @EnableEurekaServer 表示 Eureka服务注册中心启动 * </p> * * @author wbw * @date 10:24 2019/6/10 */ @EnableEurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
修改 eureka-server 的 application.yml 文件。
# eureka是一个高可用的组件, # 它没有后端缓存,每一个实例注册之后需要向注册中心发送心跳(因此可以在内存中完成), # 在默认情况下erureka server也是一个eureka client ,必须要指定一个 server。 server: port: 8761 eureka: instance: hostname: localhost client: # 是否向注册中心注册自己(因为它就是注册中心,负载均衡时需要用到) fetch-registry: false # eureka服务器访问地址 service-url: # eureka.client.service-url时写defaultZone系统没有任何提示,会让你以为没有这个配置或者是不是自己写错了 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ # 是否需要检索服务(检索服务是client端的事) register-with-eureka: false spring: application: name: eurka-server
启动 eureka server 程序,他是有界面的,浏览器访问 http://localhost:8761
注意:No application available 没有服务被发现 ……_ 因为没有注册服务当然不可能有服务被发现了。
三、创建服务提供者 (eureka client)
当client向server注册时,它会提供一些元数据,例如主机和端口,URL等。Eureka server 从每个client实例接收心跳消息。 如果心跳超时,则通常将该实例从注册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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.wbw</groupId>
<artifactId>wbw-spring-cloud</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>eureka-service-hi</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka-service-hi</name>
<dependencies>
<!-- Eureka Clients服务提供者 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- web 启动依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
启动程序添加注解。
ackage cn.wbw.eureka.service;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* 通过 @EnableEurekaClient表明自己是一个eurekaClient.
*
* @author wbw
* @date 2019/6/10 11:23
*/
@SpringBootApplication
@EnableEurekaClient
public class EurekaServiceHiApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServiceHiApplication.class, args);
}
}
添加 application.yml配置文件。
server:
port: 8765
spring:
application:
name: eureka-service-hi
eureka:
client:
service-url:
# 注册地址
defaultZone: http://localhost:8761/eureka/
需要指明spring.application.name,这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name 。
启动工程,打开http://localhost:8761 ,即eureka server 的网址:
你会发现一个服务已经注册在服务中了,服务名为SERVICE-HI ,端口为7862
这时打开 http://localhost:8762/hi?name=forezp ,你会在浏览器上看到 :
hi forezp,i am from port:8765
Eureka 服务客户端
提供服务,向注册中心注册自己
- 如果启动了多个实例此时:service-hi在eureka-server注册了2个实例,这就相当于一个小的集群。
- 通常会把这个程序改变端口单独运行几份,以提供负载均衡使用。