目录
一、简介
SpringCloud是基于SpringBoot的一整套实现微服务的框架。他提供了微服务开发所需的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等组件。
1.1 Spring-Cloud Euraka介绍
Spring-Cloud Euraka是Spring Cloud集合中一个组件,它是对Euraka的集成,用于服务注册和发现。Eureka是Netflix中的一个开源框架。
1.2 Euraka介绍
Eureka由多个instance(服务实例)组成,这些服务实例可以分为两种:Eureka Server和Eureka Client。为了便于理解,我们将Eureka client再分为Service Provider和Service Consumer。
- Eureka Server 提供服务注册和发现
- Service Provider 服务提供方,将自身服务注册到Eureka,从而使服务消费方能够找到
- Service Consumer服务消费方,从Eureka获取注册服务列表,从而能够消费服务
二、部署Eureka Server
2.1 创建项目
以下操作基于idea 2020.1.2版本
- 选择Spring Initializr
- 选择Eureka Server
2.2 配置文件
这里我用的.yml格式的配置文件
server:
port: 8086
eureka:
instance:
hostname: localhost
client:
fetch-registry: false
register-with-eureka: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:8086/eureka/
2.3 启动类
对启动类添加注解**@EnableEurekaServer**,将该服务标识为Eureka Server
@SpringBootApplication
@EnableEurekaServer
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
2.4 测试
访问localhost:8086
三、部署Eureka Client
1、Eureka Client包括两个服务模块:Service Provider(服务提供方)和Service Consumer(服务消费方)。
2、Eureka Client和Eureka Server目录类似, 不同点在于:
- 启动类,使用@EnableDiscoveryClient 标识该服务为Euraka Client
- 配置文件,需要指定Euraka Server地址和当前服务注册时的名称。
3.1 部署Service Provider
3.1.1 创建项目
创建方法与Eureka Server一致。
3.1.2 配置文件
这里用的application.yml
server:
port: 8082
spring:
application:
name: service-provider1
eureka:
client:
service-url:
defaultZone: http://localhost:8086/eureka
参数说明:
- eureka.client.serviceUrl.defaultZone:指定Eureka Server的地址
- spring.application.name:当前服务注册在Eureka Server的名称。
3.1.3 启动类
使用@EnalbeDiscoveryClinet标识当前服务为Euraka Client。
@SpringBootApplication
@EnableDiscoveryClient
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
3.1.4 请求接口
@RestController
public class TestController {
@RequestMapping(value = "/sayHi")
public void sayHi(){
System.out.println("Hello,this is the provider 1");
}
}
3.1.5 测试
打开服务注册中心,能看到新注册得服务名称
3.2 部署Servcie Customer
3.2.1 创建项目
创建方法与Eureka Server一致。
3.2.2 配置文件
这里用的application.yml
server:
port: 8081
spring:
application:
name: service-customer1
eureka:
client:
service-url:
defaultZone: http://localhost:8086/eureka
3.2.3 启动类
使用@EnalbeDiscoveryClinet标识当前服务为Euraka Client。
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
3.2.4 请求接口
从Euraka Server中获取服务提供方的服务地址信息
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
public class ClientControlelr {
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping("/queryService")
@ResponseBody
public String query() {
List<ServiceInstance> instances =discoveryClient.getInstances("service-provider1");
StringBuilder urls= new StringBuilder();
for(ServiceInstance instance : instances){
urls.append(instance.getHost()+":"+instance.getPort()).append(",");
}
return urls.toString();
}
}
3.2.5 测试
3.2.6 补充
四、自我保护机制
在Eureka Server出现以下提示
这是Eureka 提供的一个特性,在默认的情况下是打开的。当Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)
4.1 Eureka Server端属性
# 设为false,关闭自我保护。默认是打开的。
eureka.server.enable-self-preservation=false
# 清理实例失效间隔(单位毫秒,默认是60*1000)
eureka.server.eviction-interval-timer-in-ms=4000
注意:
4.2 Eureka Client端属性
# 开启健康检查,默认是开启的
eureka.client.healthcheck.enabled=true
# 单位是秒,默认30秒。此客户端发送心跳的频率
eureka.instance.lease-renewal-interval-in-seconds=30
# 单位是秒,默认90秒,表示eureka server在收到此client上次心跳之后,间隔多久没有收到,就摘除此服务。
eureka.instance.lease-expiration-duration-in-seconds=10