目标:使用Spring Cloud Eureka建立服务注册中心
开发环境:IntelliJ IDEA
操作步骤:基础环境配置->Eureka组件配置->应用参数配置->应用运行测试->HA配置
1.基础环境配置
Spring Cloud是在Spring Boot基础上构建的用于快速构建分布式系统的通用模式的工具集,因此需要简单了解Spring Boot的基本概念、开发流程。
基本概念:
Spring Boot是为了改善传统Java开发中配置繁重、开发效率低下、部署流程复杂等缺陷而产生的,使用习惯优于配置的理念让项目快速运行,以下简要介绍本项目开发相关的Spring Boot两大核心功能。
(1)可独立运行的Spring项目
Spring Boot可以以jar包形式独立运行:java -jar xx.jar;
(2)内嵌Servlet容器
Spring Boot可选择内嵌Tomcat、Jetty或者Undertow,无需以war包的形式部署项目。
开发流程:
(1)新建Maven项目命名为Spring_Cloud_Eureka
File->New->Project:选择Maven项目类型,并设置Project JDK为本地1.8版本
填写项目参数:
项目结构:其中src文件夹已删除,采用多module的工程开发模式(在后文中详述)
(2)基础配置及其说明
修改项目主配置文件pom.xml:
a.spring-boot-release设置
设置spring boot版本为1.5.3,版本参考地址:
https://repo.spring.io/milestone/org/springframework/boot/spring-boot-cli/
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.3.RELEASE</version> </parent>
b.环境变量设置
设置编码类型为UTF-8,java版本为1.8,Spring Cloud的版本为Edgware.SR3
Spring Cloud版本参考地址:
http://projects.spring.io/spring-cloud/
<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>Edgware.SR3</spring-cloud.version> </properties>c.spring-cloud依赖配置
<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>(3)Import Changes应用配置
等待配置相关依赖导入完成即可。
2.Eureka组件配置
服务注册与发现组件是为了解决服务提供者与服务消费者之间的直接耦合问题而产生的。因此服务注册与发现组件、服务提供者、服务消费者三者之间的关系可分为四个部分。
(1)各微服务启动时,将自己的网络地址等信息注册到服务发现组件中,服务发现组件存储这些信息
(2)服务消费者从服务发现组件查询服务提供者的网络地址,并使用该地址调用服务提供者的接口
(3)各个微服务与服务发现组件使用一定机制(例如心跳)通信,服务发现组件长时间无法与某微服务实例通信,则注销实例
(4)微服务网络地址发生变更会重新注册到服务发现组件
因此服务注册与发现的核心功能如下:
(1)服务注册表
组件的核心,记录微服务信息,如名称、IP、端口等,提供查询API和管理API
(2)服务注册与发现
服务注册:微服务启动时将信息注册到服务发现组件上的过程
服务发现:查询可用微服务列表及其网络地址的机制
(3)服务检查
使用一定机制定时检测已注册的服务
Spring Cloud Eureka组件:集成自Netflix开源的服务发现组件Eureka,Eureka自身是一个基于REST的服务,包含Server和Client两部分,项目地址:
https://github.com/Netflix/Eureka
在上一节主项目的基础上,新建module工程作为Eureka注册服务端模块。
开发流程:
(1)新建Module工程-CaaS_Eureka_Server
File->New->Module:选择Maven项目类型,JDK版本选择本地版本
Module结构:
(2)添加配置依赖
Eureka Server组件依赖
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> </dependencies>
spring boot maven插件支持
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
(3)编写子项目运行主程序
新建package:com.boe.caas.eureka
新建EurekaServerApplication.java
@SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
说明:
Spring Boot通常有一个名为*Application的入口类,其中包含一个main方法。
@SpringBootApplication是Spring Boot的核心注解,是一个组合注解,主要组合了@Configuration、@EnableAutoConfiguration、@ComponentScan
@EurekaServerApplication启用Eureka内置服务
3.应用参数配置
在src/main/resources下新建配置文件application.yml,配置应用启动的相关参数
其中register-with-eureka表示是否将自身注册到服务注册中心,该处设置为false
fetch-registry表示是否同步信息,此处为server集群配置,单点设置为false
server: port: 8761 eureka: instance: hostname: localhost client: register-with-eureka: false fetch-registry: false service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
4.应用运行测试
操作:run EurekaServerApplication.java
地址:http://localhost:8761/
5.HA配置
作为项目所有微服务的注册中心,Eureka Server需要有一定的高可用特性,最简单的方法为创建Server集群。
与单sever module类似,新建一个module工程,命名为CaaS_Eureka_Server_HA
与单节点的主要区别在配置文件:application.yml
spring: application: name: CaaS_Eureka_Server_HA --- spring: profiles: peer1 server: port: 8761 eureka: instance: hostname: peer1 client: service-url: defaultZone: http://peer2:8762/eureka/ --- spring: profiles: peer2 server: port: 8762 eureka: instance: hostname: peer2 client: service-url: defaultZone: http://peer1:8761/eureka/
配置本地hosts文件,加入解析:drivers/etc/hosts
127.0.0.1 peer1 peer2
使用maven插件编译子项目CaaS_Eureka_Server_HA或者mvn命令编译打包
mvn compile
mvn package
使用不同参数启动server:
java -jar xxx.jar --spring.profiles.active=peer1
java -jar xxx.jar --spring.profiles.active=peer2
可以看到peer1 server作为一个服务注册到了注册中心,并且其replica为peer2