一、简介
1.概念:
在微服务架构下,一个服务自动定位 到被调用的服务的过程称为服务发现。
2.目的:
我们约定提供服务的一方,即RPC的服务端,称为服务提供者
调用或说使用服务的一方,即RPC的客户端,称为服务消费者
1. 服务消费者上线时,能够发现合适的服务提供者
2. 当某个服务提供者上线时,消费者能够获悉服务的存在
3. 服务提供者实例发生变动不可用时(如故障 或者重新发布而不可用),消费者得到通知,停止对其调用
4. 新增服务实例可以被消费者使用,跟第一条不同的是,这里是扩展操作,即为一个已有服务增加实例(如3台服务器变成4台服务器)
3.环节:
1.服务注册,提供者将服务公之于众,让服务消费者可以知晓服务的状态
2.服务下线,提供者声明服务不再可用,后续不再调用该服务
3.服务查询,消费者可以查询到所需调用的服务的地址、端口等等信息,以用于调用
4.服务健康检查,需要知晓服务提供者当前是否可用,如果不可用则不再对外提供服务
5.服务通知,当服务状态发生变化时确保消费者知晓,则需要通知消费者
4.过程:
有服务注册表组件作为中间人,然后服务提供者启动时会将服务注册到服务注册表中,当服务调用者需要调用服务时则从服务注册表中查找相应的服务并调用。这就是服务发现的过程。具体步骤如下:
①服务提供者启动时,将服务注册到服务注册表
②服务消费者启动时拉取服务列表
③服务消费者需要调用时从服务注册表中选择合适的服务并调用
④服务注册表检测服务提供者的健康状况并更新服务列表
⑤当服务健康状态发生改变时通知客户端更新服务列表
二、Eureka
1.Eureka简介:
1.Eureka是NetFlix开源的一款服务发现组件。Spring Cloud对其进行了封装。
2.Eureka基于 REST(Representational State Transfer) 协议通信
3.Eureka不存储任何信息,而是使用客户端心跳推送的方式来做健康检测,也就是Eureka Client会在指定间隔时间内发送一段信息给服务端,服务端据此确认服务的健康性
2.主要组件:
1.Eureka-Server,独立部署的系统,负责管理服务信息(接收服务注册、检测服务是否存活),支持配置成集群,保证高可用
2.Eureka-Client,集成在服务中(服务提供与消费者都有集成),与Eureka-Server通信,执行服务注册、获取服务列表等
三、Eureka-Server搭建
1.步骤:
①IDEA中执行以下操作:File>New Project>Spring Initalizr进入如下界面,点击 Next
②填写Maven坐标GAV、项目描述等,Next
③选择相应的依赖,这里很简单,选择Eureka-Server即可,Next
④选择相应的依赖,这里很简单,选择Eureka-Server即可,Next
⑤选择项目存放位置后,完成项目,在当前窗口打开项目,此时Maven会下 载项目依赖,稍等片刻后项目即创建完成。
2. 搭建项目:
生成的项目,是标准的Spring Cloud项目,与其他Spring Boot项目pom.xml文件有不同的地方:
①:依赖管理部分导入了SpringCloud的依赖管理BOM,可以直接引用Spring-Cloud各个 组件而不需要添加版本号
<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>
</dependencies>
</dependencyManagement>
②:引用了Spring-Cloud的组件, 这里引入了Eureka-Server
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
3.添加注解:
项目虽然引入了Eureka-Server的包,但还未启用该功能,我们通过给Application添加注解来启动Eureka-Server功能。
@SpringBootApplication
@EnableEurekaServer//启动EurekaServer功能
public class EurekaserverApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaserverApplication.class, args);
}
}
4.添加配置:
给Eureka-Server添加一些必要的配置。Spring-Boot的外化配置特性,配置文件统一放在resources/application.properties中。配置如下:
#项目信息
spring.application.name=eurekaserver
server.port=9600
#单机模式配置
#服务器名
eureka.instance.hostname=localhost
#是否注册到Eureka-Server,Eureka-Server本身也可以是Client,所以有此选项,这里默认关闭
eureka.client.register--with-eureka=false
#是否拉取服务列表,同上因为是Server所以不需要拉取列表
eureka.client.fetch-registry=false
#client的服务地址,server的地址是自己
eureka.client.service-url.defaultZone=
http://${eureka.instance.hostname}:${server.port}/eureka/
5.启动并查看项目:
运行Application,服务启动日志没有报错即表示启动成功。 此时访问 localhost:9600可以看见Eureka-Server的Web界面
四、Eureka Client搭建
1.简介:Eureka-Client其实是包含在项目中的,分成服务提供者和服务消费者两个角色。我们假设这里有个电影评分服务,显然电影网站(movie)就是服务消费者,评分服务(rating)就是服务提供者了。需要分别创建movie项目和rating项目都要包含eureka-client,并通过配置指向同一个eureka-server。
2.搭建rating服务(服务提供方):
①创建项目:参考Eureka-Server搭建
②添加配置 :
#应用信息
spring.application.name=rating
server.port=9501
#Eureka配置,主要是Eureka-server的地址
eureka.client.service-url.defaultZone=http://localhost:9600/eureka
③添加评分功能 :
@RestController
public class RatingController {
@RequestMapping("rate")
public int rate(String movieName){
return movieName.length();
}
}
④启动&访问验证 :和Eureka-Server搭建的第3步添加注解一样
3.搭建movie项目(服务消费方):
①创建项目:参考Eureka-Server搭建
②添加配置:
#应用信息
spring.application.name=movie
server.port=9502
#Eureka配置,主要是Eureka-server的地址
eureka.client.service-url.defaultZone=http://localhost:9600/eureka
③添加调用评分服务的代码
(1)先配置一个 RestTemplate用于调用远程服务:
@Configuration
public class AppConfig {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
(2)评分服务的代码:
@RestController
public class MovieController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private EurekaClient discoveryClient;
@RequestMapping("movie")
public String showMovie(String movieName, ModelMap modelMap){
InstanceInfo instance = discoveryClient.getNextServerFromEureka("rating",false);
String serviceUrl= instance.getHomePageUrl();
System.out.println(serviceUrl);
int credit = restTemplate.getForObject(serviceUrl+"/rate?movieName="+movieName,Integer.class);
return "电影【"+movieName+"】的评分为"+credit;
}
}
④启动&访问验证:和Eureka-Server搭建的第3步添加注解一样