SpringCloud组件——Eureka服务治理
1、什么是是服务治理
1、服务治理是微服务架构中最核心的模块,实现对各个服务的自动化注册以及服务发现机制。那么为什么需要服务治理呢?
假如项目中只有A和B两个服务,A服务需要调用B服务,如果将这个调用方式写死在代码中(比如通过HTTP请求的方式调用,将B服务的请求路径写死在服务A调用B服务的代码中),那么一旦B服务的请求路径需要发送改变,就必须要同时修改A服务中的代码,非常麻烦。
而且更复杂的是,通常为了保证服务高可用,都会将服务B和A部署多个实例,总不可能在每一个A中都去维护一个服务B的列表吧,而且还需要手动实现服务B的负载均衡,无论是后期的维护还是代码的实现都是非常复杂的。更恐怖的是,现实中一个项目可能会具有几十上百个服务,每个服务之间都可能具有多个调用关系,而且每个服务都会有多个部署实例以及负载均衡,完全无法想象如果靠人力进行服务治理会有多恐怖。
所以,必须要有一个自动化的服务治理机制,减轻工作量,提高代码可维护性。
2、简单来说,服务治理就是服务注册以及服务发现,简单原理如下:
(1)服务注册:在服务治理框架中,都会构建维护一个注册中心,每个服务都会将自己注册到这里,比如服务的服务名、ip地址与端口号、通信协议等一系列数据存储在注册中心,注册中心按照服务的名称分类,形成一个服务清单。
比如A服务部署了三个实例(192.168.10.01:8080,192.168.10.01:8081,192.168.10.01:8082),B服务也部署了三个实例,(192.168.10.02:8080,192.168.10.02:8081,192.168.10.02:8082),当这些服务全都启动并且向服务中心注册自己后,那么服务中心的注册表会维护一个类似下表的数据表,同时注册中心还必须要定时向每个服务做一个心跳检测,判断列表中的某个地址下的服务是否可用,如果不可用还需要进行剔除,实现排除故障服务的效果。
服务名
请求地址
A
192.168.10.01:8080,192.168.10.01:8081,192.168.10.01:8082
B
192.168.10.02:8080,192.168.10.02:8081,192.168.10.02:8082
(2)服务发现:有了服务治理框架后,服务间的调用方式不需要指定具体的路径进行调用,而是通过服务名来实现调用,服务调用方不知道具体的调用实例位置,所以需要通过服务注册中心来获取该服务名对应的所有实例清单列表。比如上述的A如果要调用B,首先要从服务中心获取到B的实例地址(192.168.10.02:8080,192.168.10.02:8081,192.168.10.02:8082),然后再从这些地址中挑一个进行服务调用(这一块就涉及到了负载均衡)。
为了提高性能,可能会有一个缓存机制,即会将服务注册中心提供的服务实例地址清单缓存一份到本地,这样就不用每次调用其他服务都要请求一次服务中心来获取清单。但是这样又会有一个问题,如果某个实例服务挂了并且被注册中心剔除了,但本地缓存中的服务实例清单中仍然存在怎么办?如果对其调用肯定会出错,导致整个功能异常,后续将会讨论这个问题。
对于同一个服务,无论其部署了多少个实例,都必须保证他们具有同一个服务名,这是服务发现的保证。
2、Eureka实现服务治理
1. 在SpringCloud中,通过Eureka实现服务治理(服务注册与发现),Eureka分为服务端和客户端组件,服务端就是服务实例清单数据中心,维护保存所有的服务信息,而客户端是整合到了各个服务中,服务要通过这个客户端来向Eureka服务端进行注册以及调用其他服务。服务端与客户端均采用Java编写,所以Eureka适用于Java开发的微服务系统,但是并不是只能用于Java,因为Eureka是通过HTTP请求实现的服务调用,所以对于其他语言,只需要自己开发一套客户端即可使用。
2. 对于Eureka的服务端,也就是服务注册中心,可以实现高可用配置部署,即集群化部署,这样就保证了即使一台服务注册中心挂了,其他的服务注册中心仍然能够提供服务。
3. Eureka实现服务治理的简单实现:
(1)首先,搭建服务注册中心,也就是Eureka的服务端。
新建Springboot工程,引入Eureka相关的jar包依赖什么的就不说了。直接看配置代码
首先要在SpringBoot项目的启动类上添加一个@EnableEurekaServer注解
@EnableEurekaServer@SpringBootApplication
public class EurekaServerDemoApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerDemoApplication.class, args);
}
}
然后在application.properties进行详细配置,简答配置示例如下
server.port=8081eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:8081/eureka/
eureka.client.register-with-eureka=false:因为当前项目工程就是服务注册中心,所以不需要向自己注册自己,设置为false
eureka.client.fetch-registry=false:注册中心的责任就是维护服务实例,所以不需要检索服务,也设置为false。
这两个配置参数是用来表示向服务中心进行注册的,对于服务(Eureka客户端)来说,是不能配置为false的,但服务注册中心可以配置为false,上面两个配置都配置为false是因为现在的服务注册中心是单体,不是集群部署,不具备高可用性,所以设为false,一旦需要高可用进行集群部署服务注册中心时,上面两个参数不设置为false,默认为true即可。
对于eureka.client.serviceUrl.defaultZone=http://localhost:8081/eureka/这一行配置,其实个人刚开始觉得并不需要,因为当前服务注册中心并不需要向其他服务注册中心进行注册,所以就没配置,可以启动并且正常运行,但启动后当前服务注册中心会一直报错,问题原因可以参考https://www.jianshu.com/p/788745f7dc7d
完成配置后,启动该项目,浏览器访问http://localhost:8081/就可以看到Eureka的可视化管理界面。
(2)创建服务工程,注册服务提供者:
创建一个SpringBoot项目工程,在SpringBoot启动类上加上@EnableDiscoveryClient注解,
@EnableDiscoveryClient@SpringBootApplication
public class EurekaClientDemoApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientDemoApplication.class, args);
}
}
写一个简单的Controller类作为提供的服务,响应一个字符串即可
@RestControllerpublic class HelloController {
@RequestMapping("/hello")
public String sayHello() {
return "hello";
}
}
然后就是配置文件,主要配置服务注册中心的地址,以及当前服务的服务名
server.port=8082spring.application.name=hello-service
eureka.client.serviceUrl.defaultZone=http://localhost:8081/eureka/
此时,当前服务就可以注册到Eureka服务注册中心了,启动两个工程,打开Eureka可视化管理界面,在Instances这一栏就可以看到注册的hello-service服务
现在就已经完成了服务的注册。
3、Eureka实现高可用
1. Eureka为了实现高可用,Eureka服务注册中心,也就是Eureka的服务端可以采用集群部署模式。Eureka的集群部署实际上就是将服务注册中心作为一个服务向其他服务注册中心注册自己,形成一组互相注册的服务注册中心,进而实现服务注册中心之间的服务清单同步,达到高可用的效果,即使一个服务注册中心节点挂了,那么也依然会有其他服务注册中心节点顶替。
2. Eureka服务注册中心集群配置:
(1)在上面的单节点服务注册中心中,因为不需要向其他节点注册,所以加了两行配置
eureka.client.register-with-eureka=falseeureka.client.fetch-registry=false
但现在要搭建集群模式,这两行配置就要取消。然后分别创建两个服务注册中心项目工程peer1和peer2,其主要的配置如下
//peer1的application.properties中的主要配置server.port=8084
spring.application.name=eureka-server
eureka.client.serviceUrl.defaultZone=http://localhost:8085/eureka
//peer2的application.properties中的主要配置
server.port=8085
spring.application.name=eureka-server
eureka.client.serviceUrl.defaultZone=http://localhost:8084/eureka
(2)启动这两个工程,在浏览器中打开Eureka可视化界面,就能看到互相注册的服务,在Instances currently registered这一栏可以看到Eureka-server服务有两个实例
(3)上面是这有两个服务注册中心互相注册的情况,如果有数十个服务注册中心互相,其主要配置还是在eureka.client.serviceUrl.defaultZone这一个配置上,如果要注册到多个服务注册中心,就使用逗号将各个服务祖册中心的路径隔开。
(4)服务注册中心集群搭建完成,那么在配置一下服务注册,在服务提供者工程中,其主要配置还是在eureka.client.serviceUrl.defaultZone这一个配置上,要注册到多个服务注册中心,就使用逗号将各个服务祖册中心的路径隔开。比如上面创建的hello-service服务工程,其配置应该为
server.port=8082spring.application.name=hello-service
eureka.client.serviceUrl.defaultZone=http://localhost:8084/eureka/,http://localhost:8085/eureka/
其实只写集群中某一个服务注册中心的路径地址,服务注册中心集群中的其余节点也能感知到注册的服务,因为集群节点之间会一直做一个已注册服务清单数据同步。
但是之所以服务要注册到所有服务注册中心节点,是担心万一该服务A注册的服务中心节点B挂了,集群中的其余服务注册中心节点依旧能维持服务A处于服务清单之中并检测其心跳状态,而该服务也能与服务中心集群保持着服务清单数据的同步,否则如果该服务注册的服务中心挂了,那么该服务就会无法再与服务注册中心集群进行一个服务清单数据的同步操作,也就无法保证能够保证服务发现。
关于服务调用方,后面结合Ribbon和Feign组件进行讲解。
以上是 SpringCloud组件——Eureka服务治理 的全部内容, 来源链接: utcz.com/z/510402.html