学习目标:
学习五大核心框架中的
Eureka
学习内容:
提示:学习建立客户端,服务端并简单测试使用
作用:实现服务治理(服务注册与发现)
简介:Spring Cloud Eureka是Spring Cloud Netflix项目下的服务治理模块。
由两个组件组成:Eureka服务端和Eureka客户端。
Eureka服务端用作服务注册中心。支持集群部署。
Eureka客户端是一个java客户端,用来处理服务注册与发现。
在应用启动时,Eureka客户端向服务端注册自己的服务信息,同时将服务端的服务信息缓存到本地。客户端会和服务端周期性的进行心跳交互,以更新服务租约和服务信息。(划重点)
接下来进行代码实现,在实践中出真知
(一)建立Eureka服务端
1.1.打开IDEA点击【File】-->【New】-->【Project】
1.2.将【Server URL】更改为使用阿里的【http://start.aliyun.com】否则会连接不上导致错误
1.3. 然后我们这里选用【SpringBoot2.3.7.RELEASE】也就是正式版,然后选择
spring web 和 Eureka Server后点击【Create】创建SpringBoot项目
1.4.这里穿插一个知识点,在以往的SpringBoot工程中,你是不是司空见惯了以下这种方式进行版本控制。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.7</version> <relativePath/> <!-- lookup parent from repository --> </parent>
这里我们将使用<dependencyManagement>进行版本控制,当前我们使用的阿里源构建,创建出来的打开pom文件你会发现没有看到parent,取而代之的是dependencyManagement,一般情况下,企业都有自己的parent依赖包,然后所有的项目都必须继承对应的parent包,这时候,我们就可以通过这种方式使用springboot
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
1.5.接着将application.properties的后缀更改为yml(推荐使用yml树形结构更直观)
1.6.打开application.yml填写配置文件信息
server:
port: 8761 #服务注册中心的端口号
eureka:
instance:
hostname: localhost #服务注册中心的IP地址
client:
register-with-eureka: false #是否往服务注册中心注册自己
fetch-registry: false #是否检索服务
service-url: #指定服务注册中心的地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
1.7.接着需要在启动类上添加 @EnableEurekaServer 注解
package com.studycloud.eurekaserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
1.8.启动服务,正常运行端口号为:8761
1.9.访问 http://localhost:8761/ 进入管理页面
(二)建立Eureka客户端
1.1建立Eureka服务提供者,提供者其实是一个客户端,将服务注册到Eureka中
还是先建立一个工程,加入SpringWeb 和 Eureka Client
1.2 还是将application.properties的后缀更改为yml(推荐使用yml树形结构更直观),并写入配置内容
eureka:
client:
serviceUrl: #注册中心的地址
defaultZone: http://localhost:8761/eureka/
server:
port: 8762 #服务端口号
spring:
application:
name: eureka-service-provider #提供者的服务名称
1.3接着需要在在启动类上添加 @EnableEurekaClient 注解
(这里注意一下啊:Client端的@EnableEurekaClient 注解如果不写的话也是没问题的,我没找到原文或者引用说为什么,谁知道的话可以私信一下我,我补一下这里,为了区分我还是加这个注解的,有兴趣的可以试一试,但是服务端的@EnableEurekaServer注解是不能省略的)
1.4配置好了以后,启动该项目,成功启动
1.5接着还是打开Eureka管理页面查看,提供者已经注册上去了。
2.1,我们再创建一个Eureka服务提供者B,和前面一样只是改了个端口和名称,application.yml的配置如下
(前面的提供者名称我改为了A,这个为B)
eureka:
client:
serviceUrl: #注册中心的地址
defaultZone: http://localhost:8761/eureka/
server:
port: 8763 #服务端口号
spring:
application:
name: eureka-service-providerB #提供者的服务名称
2.2,再次启动,查看管理端,可以看到我们有AB两个提供者,提供服务
2.3接下来我们给我们的这两个服务提供者,协商一段逻辑代码
例如我们做一个Controller 写一个来获取名字的方法
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@RequestMapping("/test")
public String test(){
return "获取到了服务A的名字";
}
}
package com.studycloud.eurekaclientproducer;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@RequestMapping("/test")
public String test(){
return "获取到了服务B的名字";
}
}
2.4调用一下两个方法,测试下结果,是没有问题的,获取到的结果也是对的
3.1现在我们再来做一个消费者,其实还是一个Client,
创建Eureka-client-consumerA,端口配置为8764,其他的配置和上面一样哦
eureka:
client:
serviceUrl: #注册中心的地址
defaultZone: http://localhost:8761/eureka/
server:
port: 8764 #服务端口号
spring:
application:
name: eureka-service-consumerA #消费者的服务名称
3.2接着再启动类中添加代码实例化RestTemplate,使用他来测试我们的
RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、PUT 请求、DELETE 请求以及一些通用的请求执行方法 exchange 以及 execute。RestTemplate 继承自 InterceptingHttpAccessor 并且实现了 RestOperations 接口,其中 RestOperations 接口定义了基本的 RESTful 操作,这些操作在 RestTemplate 中都得到了实现。接下来我们就来看看这些操作方法的使用。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableEurekaClient
public class ConsumerClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerClientApplication.class, args);
}
/**
* 实例化RestTemplate
* @return
*/
@LoadBalanced
@Bean
public RestTemplate rest() {
return new RestTemplate();
}
}
3.3再创建一个TestController来进行消费
eureka-service-providerA 其实就是我们的供应者的服务器名称
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class TestController {
@Autowired
RestTemplate restTemplate;
@RequestMapping("/test")
public String test(){
String result = restTemplate.getForObject("http://eureka-service-providerA/test",String.class);
return result;
}
}
3.4来运行起来我我们来调用一下8764端口的消费者,看是什么结果
如下图,只能获取到A服务,至少证明我们的接口是通了,并且被Erueka分配给了服务A
3.5 .将消费者的 http://eureka-service-providerA/test更改为http://eureka-service-provider/test
很简单我们从单个提供者到多个提供者
更改提供者的名称都为【eureka-service-provider】
3.6此时我们再次运行程序,看下管理端
3.7,再次运行方法查看结果(这是轮询的机制进行分发的,到此如果你实际去操作了,你应该有自己的想法了)
至此我们创建的工程已经做好,下面将开始试着去实现一个小功能来理解它。
这里总结一下上面的
1)8761端口为Eureka服务端,并设置了不能注册自己
2)8762和8163端口都是客户端,作为服务提供者
3)8764为消费者
- 8762和8163端口都是客户端将服务注册到Eureka Server
- 8764去访问 http://service-provider/test 实际是Eureka Server提供了一个服务器例如A进行韩式调用
- 再次访问时,Eureka 采用默认轮询的方法所以依次是A B但是第一次不保证是哪个
Eureka 和 Zookeeper的不同:
分布式设计定理:CAP(不了解的可以查一下)
Eureka 设计侧重AP,也就是可用性。结构为:点对点,每个点互为主从,如果有一个节点的数据发生变化,其他节点会自动同步数据,并且客户端也会缓存数据,并且尽量尝试连接
Zookpeer设计侧重CP,一致性。结构为:Leader/Follwer主从,如果主节点宕机,集群无法使用,内部将触发选举的动作,故障阶段可以使用但是不保证正确性。本地缓存,但是不推荐
注册中心业务推荐使用Eureka ,因为注册信息不经常变动,一致性基本得到保证,所以Eureka 比ZK更适合。