- 系统环境:win10 + java8 + spring boot 2.1.3.RELEASE + spring cloud Greenwich.RELEASE
注意:版本不一致的情况下可能需要的依赖会有细微差别,具体需要根据官网文档进行配置依赖
- IDE: eclipse
- 配置服务器的过程不多赘述(本文比较精简),主要的配置项将会连同注释一并在代码块中贴出
建立主工程
推荐通过 https://start.spring.io/ 来配置自己的maven工程,配置完毕后将下载的压缩包解压导入即可完成初始的spring boot项目
建立各种微服务工程
同样通过 https://start.spring.io/ 来配置自己的微服务工程,根据自己需要配置多个微服务工程。如下图:
在Dependencies中可以搜索并且添加需要的基础依赖包。
spring cloud工程的配置
这里推荐使用yaml文件进行配置文件的配置。
具体配置将会在下文中的代码块中贴出。
搭建微服务集群
集群简而言之就是很多的微服务所形成的服务群,所有的微服务应该注册在注册中心中,spring全家桶提供了Eureka来作为我们的注册中心,Eureka注册中心可以同时为微服务客户端和微服务服务器两个角色。如果我们将两个Eureka服务器相互注册,那么我们就拥有了一个高可用的微服务注册中心,所谓高可用,就是当一个微服务down掉之后,另一个微服务继续正常工作,从而防止整个网站down掉。
创建注册中心需要我们在pom.xml中引入Eureka相关的包:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
在初期我们创建工程的时候在选择依赖(Dependencies)的时候就可以将需要的包引入,这里不再赘述。
作为服务器,我们需要在启动类上加入相关注解:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class ServiceServerApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceServerApplication.class, args);
}
}
@EnableEurekaServer
注解声明了这是一个Eureka服务器,可以作为注册中心使用。当然只配置注解是不够的,我们也需要在application.yaml配置文件中配置注册中心:
spring:
application:
name: service-server #上下(多个实例的情况下)的spring.application.name必须一致,这里的application.name同时也是配置文件映射的name (在注册中心中显示的name)
profiles: server-8888
server:
port: 8888 #服务管理中心端口
eureka:
client:
#是否将自己注册到Eureka Server上,默认为true
#register-with-eureka: false #(单节点时设置false)防止将自己当作客户端去注册从而引发Cannot execute request on any known server 问题
#fetch-registry: false #同上
service-url: #注册中心的url,后续的微服务都要注册到这个url上
defaultZone: http://server-9999:9999/eureka/ #默认使用8761端口,需要手动覆盖成自己的,注意url中需要加端口,查询服务和注册服务都需要依赖这个地址。这里注册的是9999的实例,因为服务器本身也是个客户端,在有多个服务器节点的情况下,可以相互注册,相互注册的注册中心会将对方注册在中心的所有微服务拷贝到自己的注册中心下,实现高可用。这里有两个节点,所以可以直接将服务器自己注册到9999的实例上。不配置这项的话,本注册中心就不会注册到其它注册中心中,只能作为自己独立的服务器提供注册服务。
instance:
hostname: server-8888 #实例的 host名,可以使用hostname来代替ip地址,如上方的defaultZone配置,这里默认的hostname是读取的本机的ip地址:localhost,server-8888只是一个别名
---
#第二个实例,在学习或者测试环境中,可以通过[---]在yaml中配置多个启动实例,同时在eclipse的 boot dashboard中也要右键增加实例配置(open config)
spring:
application:
name: service-server
profiles: server-9999
server:
port: 9999 #服务管理中心端口
eureka:
client:
#register-with-eureka: false #(单节点时设置false)防止将自己当作客户端去注册从而引发Cannot execute request on any known server 问题
#fetch-registry: false #同上
service-url:
defaultZone: http://server-8888:8888/eureka/ #默认使用8761,需要手动覆盖成自己的
instance:
hostname: server-9999
在完成上述配置后,直接在启动类或者boot dashboard中右键启动即可,在浏览器中输入 http://localhost:8888/ 或者(需要先启动) http://localhost:9999/即可进入注册中心管理。
简略图如下:
添加多个boot实例时,只需要在对应的实例上右键-> open config即可,点开配置后如下:
注意:初次添加的时候可能需要手动输入profile和main type
服务器的配置比较简单,后续没有其它特殊需求的话,默认的功能基本足够练习或者一般性的开发使用。
启动一个实例后,如果出现 connection refused
或者下图的异常不用惊慌:
上文的代码中有注释,单服务器同样也是客户端,只启动自己的情况下,注册中心没有任何服务,并且会默认将自己注册,
register-with-eureka = false
fetch-registry: false
即可取消将自己注册,因为需要搭建集群的关系,这里不推荐修改默认值,所以可以暂时无视这个异常。进入启动的注册中心后台:
注意: 注册中心会按照默认时间间隔(如果没有自定义配置的话)进行心跳刷新,在没有任何服务心跳的情况下会出现红色字体的警告,服务器会进入保护状态。
有以下几个特征:
- 自我保护机制的工作机制是如果在15分钟内超过85%的客户端节点都没有正常的心跳
- Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
- Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用(可以认为一个服务器就是一个节点。多节点组成集群)。
-
当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。
对于这个警告,解决的办法很简单,只要注册一个服务进去就可以了,因为本篇是讲述服务器配置,所以我们再开启一个服务器实例(server-9999)互相注册即可:
此时,通过控制台可以看到,之前的异常也不再出现,在微服务正常注册后,两个问题全部解决。
进入localhost:9999后,在实例的注册中心后台可以看到:
红色警告消除,由于服务器相互注册,DS Replicas会显示对方服务器的信息(server-8888或者server-9999),同时也会从该副本中拷贝所有的服务信息,形成双节点。图中同样看到,SERVICE-SERVER已经注册在注册中心中,并且有两个可达区域(2个实例)。
注意:两个实例的名字必须相同,即yaml配置文件中的spring.application.name需要一致才能形成负载均衡(后续文章会讲述)。
文章会根据最新的情况以及开发经验持续更新。。。
本文是根据本人的代码以及工作时的搭建经验反推的文字说明(基于个人理解),可能论述并不精确,仅作参考。