从此篇开始,进入 Spring Cloud 的实际开发阶段,我会按照简易的微服务架构图中的各组件部分来开始一步步搭建一个微服务架构的系统。
一、Spring Cloud Eureka
在 Spring Cloud 中,注册与发现服务的组件对应的就是 Spring Cloud Eureka。
1.1 什么是 Eureka
Eureka is a REST (Representational State Transfer) based service that is primarily >used in the AWS cloud for locating services for the purpose of load balancing and >failover of middle-tier servers.
Eureka github 上的原话如是说:Eureka 是一个 REST 风格的基础服务,它被用于 AWS 云上来定位服务,以实现对中间层服务的负载均衡和灾备处理。(这里的中间层服务就对应于微服务简易架构图中的后端通用服务)
Spring Cloud Eureka 是 Spring Cloud Netflix 下的一个组件,是基于 Netflix Eureka 的二次封装。Netflix 不是卖视频的吗?没错,是他。
但估计是他们天天卖视频太无聊,所以他们的攻城狮就开发并开源了这个组件(戏多...)。eureka 这个单词翻译成中文就是 "找到了,有了" 的意思。怎么样,那些攻城狮取名字的时候是不是非常的简单粗暴而又非常的应景呢。
Netflix Eureka 的 github 源码地址:
https://github.com/Netflix/eureka
1.2 Eureka 的组件
Spring Cloud Eureka 由于两部分组件组成:
- Eureka Server 注册中心
- Eureka Client 服务注册
Eureka Server 是提供 "服务" 注册功能的服务端,提供 "服务" 注册与发现功能。
而其他需要注册的 "服务",则使用 Eureka Client 连接到 Eureka Server中,实现 "服务" 的注册。并通过心跳连接来实现对注册的各服务的状态的监控。
Eureka Server 就好比是一个点餐平台,它已经为我们实现了买家和卖家的注册管理功能,并且还具备管理买家与卖家的信息的功能。比如,卖家是否在线、提供哪些货物等等。
二、开发 Eureka Server
2.1 开发环境
- Windows 10
- JDK 1.8.0_151
- IDEA 2017.2
- Maven 3.5
2.2 创建项目
File -> New -> Project... -> Spring Initializr
填写项目信息,包括 group 和 artifact (group 可设置为一个唯一域名的倒置,而 artifact 则对应开发的组件的名称)。"Next"
选择如下的各组件,并 Next。
注:此处的 Spring Boot 直接选择默认,这里的 2.0.2 会生成到项目里的 pom.xml 中。
填写项目名称及项目路径,并 Finish
项目结构如下
这里我们不使用 maven wrapper 插件,因此删除 .mvn、mvnw、mvnw.cmd 这几个文件。(maven wrapper 的功能此处不赘述,如有兴趣请百度)
我们基于 SpringBoot 的第一个 Eureka Server 项目到这里就创建完成了,你是不是已经急忙地想要让程序跑起来了?别急...
2.3 项目配置
1 版本配置
打开 pom.xml 文件,我们可以看到如下Spring Cloud 及 Spring Boot 版本信息
我们创建项目的时候,选择的是 SpringBoot 2.0.2,这里的 pom.xml 文件中就生成的 2.0.2.RElEASE 的 SringBoot 版本。
关于 Spring Cloud 及 Spring Boot 版本,是有一定的对应关系的,具体的对应关系请参考如下地址
https://projects.spring.io/spring-cloud/
从上面的版本对应表中,我们可以看到 Spring Cloud Netflix 组件 (Eureka 的父组件) 的 Finchley.RC2 版本对应的版本号是 2.0.0.RC2,对应的是 SpringBoot 的 2.0.2.RELEASE 版本。
再看下面两行小字,SpringCloud 官方说了,Finchley 版本使用的是 Spring Boot 2.0.x 运行,不能使用 Spring Boot 1.5.x,也就是说 Finchley 是兼容 Spring Boot 2.0.x 版本的,所以我们填写 2.0.0 也完全没有问题。
对照我们的 pom.xml 一看,是歪打正着了吗?那还配置个鬼呀。不,如果你不想要使用我这个环境,这些版本呢,例如:
我要使用 Edgware.SR3 进行开发,怎么办?
很简单,将 pom.xml 文件中的 properties 下的 spring-cloud.version 属性值改为 Edgware.SR3,相应的,把 parent 下的 version 版本改为 1.5.10.RELEASE 即可。
配置好了之后,就可以使用 maven 对依赖进行解析下载了,这可能需要一点时间,如果你感觉下载实在太慢,可以添加国内的 aliyun 的 maven 仓库:
aliyunmaven
http://maven.aliyun.com/nexus/content/groups/public/
然后就等待 maven 下载吧,下载好了大概如下:
小 tips:如何出现上图中的边栏按钮呢?
View -> Tool Buttons ->右键 Maven Projects -> Move to -> Left 即可在左侧边栏查和使用 maven 工具了
2 项目配置
处理好了依赖,下一步,我们就是要将我们的项目跑起来了。打开我们的项目
Project -> eureka -> src -> main -> java -> com.jiangzhuolin.eureka
Project -> eureka -> src -> main -> resources
可以看到我们创建的项目已经自动生成了如下两个文件,其中 EurekaApplacation 是项目的入口文件,而 application.properties 则是项目的配置文件。
- 添加 @EnableEurekaServer 注解
默认创建的 EurekaApplication 类中没有添加 @EnableEurekaServer,也就没有 EurekaServer 的功能。因此,第一步就是为其添加一个 @EnableEurekaServer,然后这个项目就是一个 EurekaServer 项目,具备了 EurekaServer 的服务注册与发现功能。
怎么样?惊不惊喜,意不意外,完全不用写一行功能代码就实现了一个注册中心。
package com.jiangzhuolin.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
- 配置服务信息
有人可能会疑惑,我们的项目不是已经取名叫 eureka 了吗?还是配置服务名称是什么鬼?
这就好比,某人搞了一个淘宝的项目,但它的公司名称叫阿里巴巴一样。这个比喻不一定正确和准确,大概理解就行。
我们先将 application.properties 改为 application.yml ,.yml 是新发展出来的标记语言,在此不赘述,反正就是简洁好用、可移置性强...
参考下方内容,配置了 服务名称,服务端口,eureka 的注册服务 URL。
spring:
application:
name: eureka
server:
port: 8000
eureka:
client:
service-url:
defaultZone: http://localhost:8000/eureka/
至此,我们的 Eureka Server 就创建及配置完成了
三、运行
此处只介绍项目的本地运行的方式,构建部署会在以后统一介绍。
右击 EurekaApplication -> Run 'EurekaApplication ' 即可启动
注,如果启动日志中有类似如下的错,不如惊慌, eureka server 会把自己也当作一个 client 端,想要找一个 server 端进入注册,而 eureka server 与 eureka client 采用心跳连接,也就是间隔一段时间连接一次,所以在这个间隙中会有报错。
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
在浏览器中输入 http://localhost:8000 即可进入 Eureka 控制台,我们可以看到服务的基本信息,以及可以看到已经注册的服务。eureka server 已经把它自己也注册到当前的注册中心了。
如果不想让 eureka server 注册到自己的注册中心,只需要在配置文件中加上 register-with-eureka: false 即可
eureka:
client:
service-url:
defaultZone: http://localhost:8000/eureka/
register-with-eureka: false
四、总结
至此,我们的 Eureka Server 就搭建完全并运行起来了,更多关于 Eureka 相关知识可访问如下网址:
https://cloud.spring.io/spring-cloud-netflix/
接下来,将开始 Eureka Client 的学习之旅。
五、附录
如果有的小伙伴问,我不喜欢用 IDEA,我就希望用 Eclipse,难道就不能用 Eclipse 开发 Spring Cloud 项目了吗?当然不是
比如你使用 Eclipse 作为 IDE,使用 maven 作为构建工具。那么你直接创建一个 maven 的空白项目,然后在 pom.xml 中添加依赖信息。然后添加一个启动入口类,加上注解,最后配置好项目的名称,端口等信息即可。在此不作赘述,如下列出 pom.xml 信息( pom.xml 配置官方也有,传送门)
本文代码: https://github.com/jiangzhuolin/eureka-server-simple