SpringCloud-服务注册与发现(注册中心)
SpringCloud-服务注册与发现(注册中心)
作者 : Stanley 罗昊
【转载请注明出处和署名,谢谢!】
注:作者使用IDEA + Gradle
注:需要有一定的java&&SpringBoot或SSM基础
SpringCloud是做什么的?
其实springcloud是基于springboot,在springboot基础之上加入了一些第三方的组件或是一些自己的组件,进行了一个分布式的扩展;
当然,它的组件非常多,在接下来的博文分享中,我将会陆续连载出来比较重要的一些组件;
注册中心、注册中心 服务器、系统健康检查、安全检查、分布式配置、分布式配置服务器、熔断器、分布式链路跟踪、分布式日志收集、分布式网关;
注册中心 eureka
为什么要有注册中心?
我们就拿电商举例;在早起开发中,一个大的项目分别由功能模块组成,比如淘宝,你有一个登陆,还有注册,购买,支付等功能,这些一个个小的模块,组成了一个大的项目,但是其中的一个小模块出现问题,那么整个项目都将被迫关闭服务器进行维护,为了解决这个问题,这些年越来越多的企业开始使用微服务分布式这个框架来解决这个问题,比如当你的注册模块出问题了,并不影响其他模块,你注册出问题,我登录照样正常,只不过注册我线关闭服务罢了;
这一个个小的模块就被称之为“服务”,但是服务与服务之前是需要相互调用,这个时候就需要注册中心作为中介一样,把这些一个个服务注册进来,进来后我帮你们进行连接,当服务器a想调用服务b的时候,服务器a仅需要在注册中心找服务b即可,而不是直接向服务b索要;
所以,我们在开发过程中,需要将我们写好的每一个功能模块(服务)都朝注册中心注册一下,但是注册中心可不管你们谁调用谁,它只管注册与发现,当然在你注册的时候,需要把服务的名称告诉注册中心,不然那么多服务,谁知道这些服务都是干嘛的;
所有服务都向注册中心注册,事实上注册中心已经搭好了一个Map,key就是你的服务名称(项目名),value就是服务的端口号,因为我们在注册的时候,不但要告诉项目名称,当然也需要告诉我们的ip地址;
创建第一个注册中心与微服务准备工作
首先,我们需要新建一个项目,这里我选用了Gradle,因为比较方便好用,个人感觉Maven太过繁琐笨重;
创建好项目后,接下来,我们需要在build.gradle文件中进行一些配置,这些配置我就不一一讲解了,所以需要有boot的基础;
apply plugin: 'java' apply plugin: 'spring-boot' sourceCompatibility = 1.8 dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' } //在编译构建时的配置 buildscript { ext { //定义一个变量,统一规定springboot的版本 springBootVersion = '1.5.10.RELEASE' } repositories { maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } jcenter() mavenCentral() //spring repo maven { url "http://repo.spring.io/snapshot" } maven { url "http://repo.spring.io/milestone" } maven { url "http://repo.spring.io/release" } maven { url "http://repo.spring.io/plugins-snapshot" } } dependencies {//用来打包 classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } //统一所有项目的配置 allprojects { group 'com.lh' version '1.0-SNAPSHOT' ext { springCloudVersion = 'Edgware.SR2' } repositories { maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } jcenter() mavenCentral() //spring repo maven { url "http://repo.spring.io/snapshot" } maven { url "http://repo.spring.io/milestone" } maven { url "http://repo.spring.io/release" } maven { url "http://repo.spring.io/plugins-snapshot" } } //指定编码格式 tasks.withType(JavaCompile) { options.encoding = "UTF-8" } } //统一子项目的配置,仅对子项目生效 subprojects { apply plugin: 'java' apply plugin: 'idea' apply plugin: 'spring-boot' dependencies { compile('org.springframework.boot:spring-boot-starter-web') { //移出tomcat exclude module: "spring-boot-starter-tomcat" } //undertow(性能比tomcat好,吞吐量大) compile 'org.springframework.boot:spring-boot-starter-undertow' //健康检查 compile 'org.springframework.boot:spring-boot-starter-actuator' //集成Redis compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis' testCompile( group: 'junit', name: 'junit', version: '4.12' ) } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } } }
配置完成后点击导入,请耐心等待他下载完环境以及jar包:
创建第一个注册中心与微服务
在我们刚刚创建好的项目上右键,选择New-》Module;
到这里有有些疑惑了,为什么要在项目中,再创建一个项目呢?
因为,我们现在的这些操作,实际上就是微服务,我们把一个大的项目进行了拆分,分成了一个个小的项目(也被称之为,“子项目”),可以把他们理解HTML中的DIV,我们现在建的是一个最外层的DIV,我们准备建的是大DIV里面中的小DIV;
在选择Module后勾选Gradle跟Java点击NEXT,然后给这个模块起个名字,也就是给这个服务起个名字;
建立完模块后,我们接下来就把这个模块当做一个注册中心,没错,往后的项目,我们都需要朝着它进行注册;
在这个Module项目结构下(我这个模块的名称是:reigster-center)点击build.gradle这个配置文件中,进行一个简单的配置;
刚才我说了,我们需要把这个模块做成一个注册中心,所以我们需要在build.gradle引入一个jar包来配置注册中心所具备的条件;
build.gradle里的配置:
dependencies { //eureak:注册中心,服务器 compile 'org.springframework.cloud:spring-cloud-starter-eureka-server' }
导入成功后,接下来,我们需要在项目的src-main-resources目录下创建一个yml配置文件:
配置文件内容:
server: port: 8080 spring: application: name: reigster-center eureka: client: register-with-eureka: false #启动时不注册,来表示自己是一个注册中心 fetch-registry: false #不在注册中心拉取数据 service-url: defaultZone: http://localhost:8081/eureka/,http://localhost:8080/eureka/,http://localhost:8082/eureka/ server: enable-self-preservation: true #是否开启eureka服务器的自我保护
首先,8080就是我们注册中心的端口号,我们访问的时候,也需要在地址栏输入8080;
name 代表你的服务名称,这里写自己的项目名称即可;
register-with-eureka: true #启动时不注册,来表示自己是一个注册中心
fetch-registry: true #不在注册中心拉取数据
如果是其他项目,我们需要向注册中心请求资源,获取数据,但是注册中心不需要,因为我自己就是一个注册中心,我何必具备这些功能,所以这里就把一些功能关闭
可以看到,下面编写了许多的端口号,这里面的每一个地址都是一个注册中心,在启动的时候进行相互注册,如果其中一个注册中心出现故障,那么另外两个顶替,从而也实现了负载均衡与集群;
自我保护我会在后面的文章中会重点介绍;
配置启动注册中心
当以上配置均完成后,我们开始编写启动类,先看下我点项目结构:
在java目录下创建一个包,代表这个包只存放启动类;
在包中编写启动类(RegisterCenterProvider)用于启动注册中心:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @EnableEurekaServer @SpringBootApplication public class RegisterCenterProvider { public static void main(String [] args){ SpringApplication.run(RegisterCenterProvider.class,args); } }
启动注册中心
准备工作完成后,我们只需运行启动类即可启动注册中心;
无需编写其他代码;
准备启动时,先看一下自己的注册中心端口号,我的是8080,这里可以随便写,但是要注意,不要写重复了;
下面,我们直接在地址栏输入请求地址即可;
划红线的那一栏就表明你所注册进来的服务;
今日感悟:
一件东西越难获得,往往它的价值就越高;
做人也是如此,如果你总是轻易的答应别人;
甚至讨好别人,那,你的自身价值也就越低廉