服务治理是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册与发现。
答:随着业务的发展,系统功能越来越复杂,相对应的微服务应用也不断增加,一些静态配置也会变得越来越难维护。服务治理就是为了解决微服务架构中的服务实例管理问题而产生的。
答:服务治理 = 外卖平台。微服务 = 各个餐厅。调用者(消费者)= 吃货们。
每一个开餐厅老板(微服务,提供服务的一方),都需要去外卖平台申请入驻(注册服务),平台会进行备案这些餐厅经营内容,以便顾客快速搜索到对应服务(服务治理),吃货们(消费者,一般是 API 接口调用)搜索蛋糕、披萨的餐厅等等,点外卖消费。有餐厅不合规,马上封店剔除。所以需要一个平台来管理这些餐厅的信息,否则餐饮行业秩序就混乱了。这就是服务治理的意义。
这几年很多从事 IT 行业的人对“微服务架构”热情非常高!招聘网随便搜索与 Java 相关的职位,几乎都有微服务架构基础的要求。在服务治理这一块,阿里巴巴有开源代表Dubbo,Apache的Consul等。分布式配置管理有百度的Disconf、Spring Cloud的Config等。此外还有ZooKeeper,ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务。
一大堆技术名词,让刚入门的学习者“落荒而逃”。感觉要做一个网站,要懂这、要懂那,面试还要答得上,最好还有项目实战。就问你怕不怕?
在中国历史上,“合久必分,分久必合”是古代史发展规律!战国七雄经过长达254年纷争最终由秦国一统天下!
而 Spring Cloud 就是“秦国”了:一统 Java(不仅仅是Java) 各种技术的天下!
答:Spring Cloud 是一个基于 SpringBoot 实现的微服务架构开发工具,它涉及服务治理、配置管理、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供一种简单的开发方式。Spring Cloud 是一个解决微服务架构实施的综合性解决框架,它整合了诸多被广泛实践和证明过的框架作为实施的基础部件,并在该体系基础上创建了一些优秀的边缘组件。说白了,就是大型综合商场。吃喝玩乐购一条龙服务。
每一个Spring Cloud 的版本都包含了不同版本的子项目,为了管理每个版本的子项目清单,避免版本号与其子项目的版本号混淆,故没有采用版本号的方式,而是采用版本名的方式。这些版本名称的命名方式采用了伦敦地铁站的名称,同时根据字母表的顺序来对应版本时间顺序,比如:最早的Release版本:Angel,第二个Release版本:Brixton,然后是Camden、Dalston、Edgware,目前最新的是Greenwich版本(截止2019年3月20日)。版本名后面的SR1就是版本号了(Service Release 1)。
查看SpringCloud版本信息:https://github.com/spring-cloud/spring-cloud-release/releases
Finchley 与 Spring Boot 2.0.x, 兼容,不支持 Spring Boot 1.5.x.
Dalston 和 Edgware 与 Spring Boot 1.5.x, 兼容,不支持 Spring Boot 2.0.x.
Camden 是构建在 Spring Boot 1.4.x, 之上,但也支持 1.5.x. (淘汰,不学)
Brixton 是构建在 Spring Boot 1.3.x, 之上,但也支持 1.4.x. (淘汰,不学)
Angel 是构建在 Spring Boot 1.2.x, 之上,但也兼容 Spring Boot 1.3.x. (淘汰,不学)
注意: Angel 和 Brixton 两个版本已于2017年7月终止不再进行维护。
接下来的学习,是 Finchley SR2 版(主要是开始兼容 Spring Boot 2.0 版本升级太快,学好一个版本就OK,不要追求太高版本,否则遇到问题很难找到回答)。
我们看下最新的版本号已经到 H 版了(截止2019年9月25日):
我们还要注意,Finchley 版仅支持 SpringBoot 2.0.X 的版本,用其它版本是无法运行的! 我们的SpringBoot 版本选择 2.0.8
更多资讯,可以参考官网:https://spring.io/projects/spring-cloud#overview
记住:平时开发过程中,如果遇到问题,且根据网上说的去做,但仍无法解决问题,一般是版本有差异导致的!
1、打开我们系列教程里提到的 IDEA 工具,新建一个项目,名称叫做:SpringCloudProject
步骤:File ——》New——》Project
左边的菜单栏选择:Maven。注意到 IDEA 工具已经关联了 SDK,如果没关联,需要设置关联。查看我前几篇博客。
Next 之后,在 GroupId 输入组织机构信息,一般在公司开发的时候,用的是公司的名称+域名倒转的形式。
为了统一学习,少走弯路,我们统一叫做:com.study,等掌握技能了再单飞吧!
ArtifactId:MyProject
然后设置保存的位置,以前用 Eclipse 还有 workspace 的说法,到了 IDEA 工具之后,为了适应分布式开发,一般都是另外创建文件夹存放项目。
点击 Finish 之后,IDEA 提示我们是否在新窗口打开。同样,为了适应分布式开发,我们点击 New Window。勾选默认。
以后打开新项目,都在新窗口打开,这个很方便做开发。
说明:我们创建的这个 Maven 项目,是一个统一管理的项目,实际上它并不包含任何 Java 代码,它的作用就是统一管理各个模块之间的关系,以及 jar 包版本的管理,以及项目版本等管理。
我们先在需要修改 pom.xml 这个文件,配置项目的编译版本,一些属性和连接数据库的版本。完整的配置如下:
4.0.0
com.study
MyProject
1.0-SNAPSHOT
eureka-server
pom
UTF-8
1.8
1.8
1.1.16
org.springframework.boot
spring-boot-starter-parent
2.0.8.RELEASE
org.springframework.cloud
spring-cloud-dependencies
Finchley.SR2
pom
import
com.alibaba
druid
${druid.version}
说明:
1、第一次使用 IDEA 工具的 pom.xml 文件时,右下角会提示是否自动导入 jar 包,我们选择自动导入。
2、IDEA 编辑器会自动帮我们保存编辑的文件,不需要 Ctrl + S,还能查询到本地修改记录。这有异于 Eclipse 等多种编辑软件。(方法:对着文件鼠标右键,找到“Local History”——》“Show History”)
3、Maven 会自动帮我们从阿里云服务器(我们在 settings.xml 配置过阿里云镜像)下载所有的 jar 依赖包到我们本地中央仓库(就是我们配置的 repository 路径,如果我们本地的仓库已经有了该 jar 包,就不会再去下载。),在 IDEA 工具的右下角显示进度信息。如果不是配置阿里云镜像,那简直龟速!
这时候我们打开 repository ,就能看到下载好的 jar 包了。有了 Maven,程序员无需到处找 jar 包来粘贴了!苦尽甘来。
我们打开配置的 repository 路径看下,确认有 jar 包下载到本地仓库了:
4、pom.xml 配置文件里:
properties:节点是负责管理属性信息的,我们这里声明了字符集和编译的版本,以及数据库连接池的版本。
dependencyManagement:节点是管理依赖的,所有的 jar 包依赖都需要写到此节点之下。
dependencies:是依赖管理的集合节点。
dependency:是具体的某个 jar 依赖节点。
以后需要寻找 jar 依赖,可以进入 Maven 官网搜索:https://mvnrepository.com/ 找到 Maven 的依赖。
等待 20 分钟(网络慢的话稍等30分钟)。。。下载 jar 依赖完毕。
5、接下来,我们创建一个注册中心的模块 module,取名:eureka-server。对着项目鼠标右键,New——》Module
如果出现 pom.xml 提示下载失败,请修改 maven 的 settings.xml 文件。把路径改成 // 就没问题了。
6、修改 EurekaServer 的 pom.xml 配置文件。重点是需要增加 spring-cloud-starter-netflix-eureka-server 依赖。
SpringCloud Eureka 使用 Netflix Eureka 来实现服务注册与发现,它既包含服务端组件,也包含客户端组件。它采用的是 Java 编写,所以 Eureka 主要适用于通过 Java 实现的分布式系统,但由于 Eureka 服务端的服务治理机制提供完备的 RESTful API,所以它也支持非 Java 语言构建的微服务应用纳入 Eureka 的服务治理体系中来。
MyProject
com.study
1.0-SNAPSHOT
4.0.0
eureka-server
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
7、我们先创建1个package,再创建 SpringBoot 的启动类。
输入:com.study,点击OK。我们看到 package 新建好了,但是看起来不怎么习惯,我们习惯看树形结构。可以设置上面齿轮形状的 Compact Middle Packages,取消勾选,让包不紧凑。
效果图:
然后,创建一个SpringBoot 启动类:EurekaServerApplication,要放在 study 包的这一层
注意:1、启动类我们最好以 Application 结尾
2、启动类的创建位置,最好放在根包下,方便程序扫描到。我这里只有一层,所以放在 java 这个包下。
在 EurekaServerApplication 这个类增加以下 2 个注解,表明它是一个服务注册中心。这就是别人封装框架的好处。
@SpringBootApplication
@EnableEurekaServer
然后,新建一个 main 函数(前面有教学如何快速创建 main 函数的快捷方式)
package com.study;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* @author biandan
* @signature 让天下没有难写的代码
* @create 2019-10-10 下午 11:33
*/
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
然后,我们在 resources 文件夹下,创建一个配置文件:application.yml (工作以后,我们可以复制别的配置文件修改下即可)
然后,在 application.yml 文件里,粘贴如下代码:
# 这是服务配置的节点
server:
# 服务的端口号默认是 8080,我们这里配置成 8000,方便学习
port: 8000
# 这是注册中心的节点配置,IP地址是 127.0.0.1其实就等于localhost
eureka:
instance:
hostname: 127.0.0.1
client:
# 注册中心也会将自己作为客户端来尝试注册自己,我们禁用它的客户端注册行为
registerWithEureka: false
# 注册中心的职责就是去维护服务实例,不需要去检索服务,这里设置 false
fetchRegistry: false
# 这是注册中心的服务访问地址,EL 表达式获取到上面的主机和端口号。注意 yml 配置文件是有顺序的
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
application:
name: eureka-server
说明:
①server 的配置中显式的配置了端口号,也可以不配置,默认是8080,我们这里配置8000,方便学习,知其然!
②yml 配置文件有个需要注意的就是,英文冒号后,需要加一个空格,再输入参数,否则配置无效。
③defaultZone:这里使用 ${eureka.instance.hostname} 取值方式(EL表达式),主要是为了统一修改,需要改动的时候,只需要修改一个地方,其它地方都取它的值,不用每个地方都去修改。在以后的开发中,会经常用到这种思想!
④eureka.client.registerWithEureka:false和fetchRegistry:false,禁用它的客户端注册行为和不去检索服务,表明自己是一个eureka server。
⑤yml 的配置文件以“键值对”的形式保存,每个文件只允许一个相同的key,也就是说,如server作为key,只允许出现一次,否则编译器就会出错。
⑥使用缩进表示层级关系,相同层级的元素需要左侧对齐。
⑦实际学习中,我们不再使用 localhost,而是采用 IP 地址的形式,因为实际生产中,每台互联网的服务器都有一个 IP 地址,提前进入 IP 的地址学习,有助于更快速融入实际开发中。
⑧eureka-server:是我们给这个注册中心起的名字。
OK,万事俱备,只欠东风。我们接下来运行一下注册中心。介绍一种最常见的运行方式。
对着 EurekaServerApplication 这个类鼠标右键,选择 Debug 模式运行。一般来说,开发的时候,优先选择 Debug 模式。
看到控制台输出如下信息则启动成功(我们设置的端口号是8000)
我们注意到有一个 Tomcat 的启动信息,我们的程序启动在 Tomcat 服务器的 8000 端口上,说明框架集成了 Tomcat!
接下来,我们打开浏览器,在浏览器地址栏输入:http://127.0.0.1:8000/ 看到如下页面,说明我们的注册中心启动成功!
简单的几句代码,就完成了一个注册中心的搭建。这归功于架构师们啊!
用白话来说,注册中心的作用就像是一个电商平台。它负责所有卖家(服务提供者)和买家(消费者)之间的关系协调。