大家好,又见面了,我是你们的朋友全栈君。
SpringCloud是目前非常流行的一个微服务框架,基于springboot,由多个独立模块集合而成。每个模块既可以是一个服务项目,比如会员服务,订单服务等,也可以是公用的API给其他模块使用。可以理解为把一个大的项目拆分成很多小的模块,这些模块通过httpclient+json的形式完成服务之间的通讯,而且每个模块都有自己独立的业务和部署,使得粒度更加精细。
五大组件如下:
服务注册与发现——Eureka
服务间通讯与负载——Ribbon
断路器——Hystrix
服务网关——Zuul
配置中心——Config
任何一个rpc远程框架都要有一个服务中心用来存储服务信息,SpringCloud支持eureka,consul,zookeeper三种,在idea中创建项目的时候也会看到它们,eureka从2.0以后不再开源(不开源并不是不让用),也可以使用consul和zookeeper。
服务注册与发现Eureka
服务注册中心作用是存储各个服务信息,通过查询服务列表知道哪些服务在线,隔一段时间(默认30秒)刷新一次,及时移除崩溃的服务。每个服务的信息以key/value的形式存储在服务中心,key是服务名字,即serviceid,value是服务所在的ip+端口号,服务之间进行通讯的时候,通过key服务名称找到要通讯服务的地址信息,进行通讯。
一,单个eurake注册中心
创建一个名为cloud的maven项目,新建三个模块,分别是eurake,order服务,user服务
如图所示:
eurake为服务注册中心,order和user是两个测试客户端
配置eurake:
引入eurake-server相关jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
启动类开启注解
@EnableEurekaServer
application.properties中配置端口号,服务名称,以及注册中心相关
#项目端口号
server.port=8080
#服务名称,serverid
spring.application.name=eurake-server
#注册中心ip
eureka.instance.hostname=localhost
#是否需要向注册中心注册自己,单个的eurake-server不需要开启
eureka.client.register-with-eureka=false
#开启检索服务,单个的eurake不需要开启
eureka.client.fetch-registry=false
#注册中心地址,由注册中心ip和项目端口号拼接/eurake
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
完成启动eurake项目,访问localhost:8080
此界面就是eurake服务中心页面 Instances currently registered with Eureka 下面为服务列表,目前为空
配置客户端order和user
引入jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
启动类开启注解@EnableEurekaClient,这里也可以写@EnableDiscoveryClient,后者同时也支持consul和zk。
分别打开application.properties配置
#项目端口号
server.port=8082
#服务名称,serverid
spring.application.name=order-client
#注册中心地址,把自己注册到注册中心
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka
#项目端口号
server.port=8081
#服务名称,serverid
spring.application.name=user-client
#注册中心地址,把自己注册到注册中心
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka
启动order和user服务
刷新注册中心
列表中可以看到order和user两个服务已经注册进去。
二,多个eurake集群
各个服务通讯,包括zuul等部分都需要注册中心保持在正常状态,如果注册中心崩溃,就不能从注册列表读取到每个服务的地址信息,从而使得这些服务之间没有了通讯,造成崩溃。所以正常来说至少需要两到三个eurake同时运行来保证整个微服务系统正常。
集群思路很简单,多个eurake中心之间“你中有我,我中有你”,每个都是客户端,每个都是服务器,互相注册,这样就能互相检测;同时,把其他客户端如order和user在这些业务模块都注册到这些eurake中心中,这样一个挂了其他的还能服务它们。
新建并配置eurake2
eurake2作用与eurake一致,也是一个服务中心
引入jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
添加注解@EnableEurekaClient和@EnableEurekaServer,它即为server也是client
配置文件application.properties
#项目端口号
server.port=8079
#服务名称,serverid
spring.application.name=eurake-server2
#注册中心ip
eureka.instance.hostname=localhost
#是否需要向注册中心注册自己,单个的eurake-server不需要开启,多个需要开启
eureka.client.register-with-eureka=true
#开启检索服务,单个的eurake不需要开启,多个需要开启
eureka.client.fetch-registry=true
#注册中心地址,由注册中心ip和项目端口号拼接/eurake
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka/
修改eurake
多引入jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
启动类在原来基础添加注解@EnableEurekaClient
修改applicaition.properties配置
#项目端口号
server.port=8080
#服务名称,serverid
spring.application.name=eurake-server
#注册中心ip
eureka.instance.hostname=localhost
#是否需要向注册中心注册自己,单个的eurake-server不需要开启,多个需要
eureka.client.register-with-eureka=true
#开启检索服务,单个的eurake不需要开启,多个需要
eureka.client.fetch-registry=true
#注册中心地址,由注册中心ip和项目端口号拼接/eurake,这里它需要向8079即eurak2中注册
eureka.client.serviceUrl.defaultZone=http://localhost:8079
修改order和user
修改application.properties配置,在注册中心地址上加上8079即eurake2的地址,中间逗号
#注册中心地址,把自己注册到注册中心
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka,http://localhost:8079/eureka/
分别启动eurake,eurake2,order和user
首先输入localhost:8080
看到列表中包含eurake(自己),order,user和eurake2四个个服务
然后打开eurake2地址 localhost:8079
发现只有eurake和eurake2(自己)两个注册上了,这时要注意:注册过程中,客户端只会保证有一台服务中心有对应服务列表,当前服务中心宕机后才会“转移”到其他服务注册中心
做个测试,关闭eurake,等待30秒(默认心跳时间),看order和user是否会转移到eurake2
发现order和user已经过来了,但是服务列表中还有eurake服务信息,明明已经把它关闭了,这是因为Eureka拥有自我保护机制,宕机的节点不会主动T除,而是等待它重连。
可以在application.properties中设置T除已经挂掉的节点。
服务端:
eureka.server.enable-self-preservation//(设为false,关闭自我保护)
eureka.server.eviction-interval-timer-in-ms//清理间隔(单位毫秒,默认是60秒)
客户端:
#每间隔1s,向服务端发送一次心跳
eureka.instance.lease-renewal-interval-in-seconds =1
#2s之内没有心跳就踢出
eureka.instance.lease-expiration-duration-in-seconds=2
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/138868.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...