目录
服务注册发现_创建服务消费者
创建cloud-consumer-order80模块
pom文件添加依赖
<dependencies>
<!-- 引入Eureka client依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
</dependencies>
写yml文件
eureka:
client:
# Eureka Server地址
service-url:
defaultZone: http://localhost:7001/eureka
spring:
application:
# 设置应用名字
name: cloud-order-consumer
server:
port: 80
编写主启动类
/**
* 主启动类
*/
@SpringBootApplication
@EnableEurekaClient
@Slf4j
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class,args);
log.info("*************** 订单服务消费者启动成功 ***********");
}
}
测试
先启动EurekaServer服务,访问http://locahost:7001
服务注册发现_服务自保和服务剔除机制
服务剔除,服务自保,这两套功法一邪一正,俨然就是失传多年的上乘心法的上卷和下卷。但是往往你施展了服务剔除便无法施展服务自保,而施展了服务自保,便无法施展服务剔除。也就是说,注册中心在同一时刻,只能施展一种心法,不可两种同时施展。
服务剔除
注意: 服务剔除把服务节点果断剔除,即使你的续约请求晚了一步也毫不留情,招式凌厉,重在当断则断,忍痛割爱。
心法总决简明扼要: 欲练此功,必先自宫
服务自保
注意:
服务自保把当前所有节点保留,一个都不能少,绝不放弃任何 队友。心法的指导思想是,即便主动删除,也许并不能解决问 题,且放之任之,以不变应万变。
心法总决引人深思:
宫了以后,未必成功 如果不宫,或可成功
心法总纲
在实际应用里,并不是所有无心跳的服务都不可用,也许因为短暂的网络抖动等原因,导致服务节点与注册中心之间续约不上,但服务节点之间的调用还是属于可用状态,这时如果强行剔除服务节点,可能会造成大范围的业务停滞。
Euraka服务自保的触发机关
自动开关
注意: 服务自保模式往往是为了应对短暂的网络环境问题,在理想情况下服务节点的续约成功率应该接近100%,如果突然发生网络问题,比如一部分机房无法连接到注册中心,这时候续约成功率有可能大幅降低。但考虑到Eureka采用客户端的服务发现模式,客户端手里有所有节点的地址,如果服务节点只是因为网络原因无法续约但其自身服务是可用的,那么客户端仍然可以成功发起调用请求。这样就避免了被服务剔除给错杀。
手动开关
这是服务自保的总闸,以下配置将强制关闭服务自保,即便上面的自动开关被触发,也不能开启自保功能。
# 参数来关闭保护机制,以确保注册中心可以将不可用的实例 正确剔除,默认为true。
eureka.server.enable-self-preservation=false;
实时效果反馈
1.Eureka技术中服务自保主要应对___问题。
A 网络环境
B 单点故障
C 兼容
D 安全
2. Eureka技术中如何手动关闭服务自保的总闸____。
A eureka.server.enable-self=true;
B eureka.server.enable-self=false;
C eureka.server.enable-self-preservation=true;
D eureka.server.enable-self-preservation=false;
服务注册发现_actuator微服务信息完善
SpringCloud体系里的,服务实体向eureka注册时,注册名默认是 IP名:应用名:应用端口名。
问题:
自定义服务在Eureka上的实例名怎么弄呢
在服务提供者pom中配置Actuator依赖
<!-- actuator监控信息完善 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
在服务提供者生产者application.yml中加入
eureka:
instance:
#根据需要自己起名字
instance-id: springcloud-dept-8001
测试
实时效果反馈
1.下列自定义服务在Eureka上的实例名正确的是____。
A eureka.instance.instance
B eureka.instance.id
C eureka.instance.instance-id
D 以上都是错误
服务注册发现_服务发现Discovery
修改payment8001的Controller
/**
* 支付控制层
*/
@Slf4j
@RestController
public class PaymentController {
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/payment/discovery")
public Object discovery(){
// 获取所有微服务信息
List<String> services = discoveryClient.getServices();
for (String service : services) {
log.info("server:={}",service);
}
return this.discoveryClient;
}
}
RestTemplate介绍
RestTemplate 是从 Spring3.0 开始支持的一个 HTTP请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、 PUT 请求、DELETE 请求以及一些通用的请求执行方法 exchange 以及 execute。
在配置类中的restTemplate添加@LoadBalanced注解
这个注解会 给这个组件 有负载均衡的功能
@Configuration
public class CloudConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
修改payment8001工程controller
@Slf4j
@RestController
@RequestMapping("/payment")
public class PaymentController {
@GetMapping("/index")
public String index(){
return "payment + successs";
}
}
编写order80工程Controller
@RestController
@RequestMapping("/order")
public class OrderController {
// HTTP 请求工具
@Autowired
private RestTemplate restTemplate;
/**
* 测试服务发现接口
* @return
*/
@GetMapping("/index")
public String index(){
//1.远程调用方法的主机
//Stringhost="http://localhost:1000";
//将远程微服务调用地址从"IP地址+端口号改成"微服务名称""
String host = "http://cloud-payment-provider"
// 2. 远程调用方法具体URL地址
String url = "/payment/index";
// 3. 发起远程调用
//getForObject:返回响应体中数据转化成的对象,可以理解为json
//getForEntity:返回的是ResponseEntity的对象包含了一些重要的信息
String forObject = restTemplate.getForObject(host + url,String.class);
return forObject;
}
}
服务注册发现_高可用Eureka注册中心
在微服务架构这样的分布式环境中,我们需要充分考虑发生故障的情况,所以在生产环境中必须对各个组件进行高可用部署,对于微服务如此,对于服务注册中心也一样。
问题:
Spring-Cloud为基础的微服务架构,所有的微服务都需要注册到注册中心,如果这个注册中心阻塞或者崩了,那么整个系统都无法继续正常提供服务,所以,这里就需要对注册中心搭 建,高可用(HA)集群。
Eureka Server的设计一开始就考虑了高可用问题,在Eureka的服务治理设计中,所有节点即是服务提供方,也是服务消费方,服务注册中心也不例外。是否还记得在单节点的配置中,我们设置过下 面这两个参数,让服务注册中心不注册自己:
eureka.client.register-with-eureka-false
eureka.client.fetch-registry-false
实时效果反馈
1.单机Eureka注册中心服务会出现_____问题。
A 网络环境
B 单点故障
C 兼容
D 安全
服务注册发现_高可用Eureka注册中心搭建
构建cloud-eureka-server7002工程
修改Pom
<dependencies>
<!-- 服务注册发现Eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
修改映射配置
找到C:\Windows\System32\drivers\etc\hosts
#添加如下配置
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
修改7001YML文件
#修改7001主机yml文件
server:
port: 7001
eureka:
instance:
# eureka服务端的实例名字
hostname: eureka7001.com
client:
#表 示是否将自己注册到Eureka Server
register-with-eureka: false
# 表示是否从Eureka Server获取注册的服务信息
fetch-registry: false
# 设置与 Eureka server交互的地址查询服务和注册服务都需要依赖这个地址
service-url:
defaultZone: http://eureka7002.com:7002/eureka/
修改7002YML文件
#修改7001主机yml文件
server:
port: 7002
eureka:
instance:
# eureka服务端的实例名字
hostname: eureka7002.com
client:
#表 示是否将自己注册到Eureka Server
register-with-eureka: false
# 表示是否从Eureka Server获取注册的服务信息
fetch-registry: false
# 设置与 Eureka server交互的地址查询服务和注册服务都需要依赖这个地址
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
编写主启动类
/**
* 主启动类
*/
@Slf4j
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7002 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7002.class,args);
log.info("*************** Eureka 服务启动成功 ***********");
}
}
将支付微服务8001发布到Eureka集群上
eureka:
client:
service-url:
defaultZone:http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
将订单微服务80发布到Eureka集群上
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
测试
1 先启动EurekaServer集群
2 在启动服务提供者provider服务
3 在启动消费者服务
客户端负载均衡_什么是负载均衡
为什么需要负载均衡
俗话说在生产队薅羊毛不能逮着一只羊薅,在微服务领域也是这个道理。面对一个庞大的微服务集群,如果你每次发起服务调用都只 盯着那一两台服务器,在大用户访问量的情况下,这几台被薅羊毛的服务器一定会不堪重负。
负载均衡要干什么事情
负载均衡有两大门派,服务端负载均衡和客户端负载均衡。我们先来聊聊这两个不同门派的使用场景,再来看看本节课的主角Spring Cloud Loadbalancer 属于哪门哪派。
服务端负载均衡
在服务集群内设置一个中心化负载均衡器,比如Nginx。发起服务间调用的时候,服务请求并不直接发向目标服务器,而是发给这个全局负载均衡器,它再根据配置的负载均衡策略将请求转发到目标服务。
优点:
1、服务端负载均衡应用范围非常广,它不依赖于服务发现技术,客户端并不需要拉取完整的服 务列表;同时,发起服务调用的客户端也不用操心该使用什么负载均衡策略。
劣势:
1、网络消耗
2、复杂度和故障率提升
Spring Cloud Loadbalancer 可以很好地弥补上面的劣势,那么它是如何做到的呢?
客户端负载均衡
Spring Cloud Loadbalancer 采用了客户端负载均衡技术,每个发起服务调用的客户端都存有完整的目标服务地址列表,根据配置的负载均衡策略,由客户端自己决定向哪台服务器发起调用。
优势:
1、网络开销小
2、配置灵活
劣势:
需要满足⼀个前置条件,发起服务调用的客户端需要获取所有目标服务的地址,这样它才能使用负载均衡规则选取要调用的服务。也就是说,客户端负载均衡技术往往需要依赖服务发现技术来获取服务列表。
负载均衡需要解决两个最基本的问题:
第一个是从哪里选服务实例
在Spring Cloud的Eureka微服务系统中,维护微服务实例清单的是 Eureka服务治理中心,而具体微服务实例会执行服务获取,获得微服务实例清单,缓存到本地,同时,还会按照一个时间间隔更新这份实例清单(因为实例清单也是在不断维护和变化的)。
第二个是如何选择服务实例
通过过负载均衡的策略从服务实例清单列表中选择具体实例。
注意: Eurka和Loadbalancer 自然而然地到了一起,一个通过服务发现获取服务列表,
另一个使用负载均衡规则选出目标服务器,然后过着没羞没躁的生活。
什么是Spring Cloud Ribbon
Spring Cloud Ribbon是NetFlix发布的负载均衡器,它有助于Http和Tcp的客户端行为。可以根据负载均衡算法(轮询、随机或自定义)自动帮助消费者请求,默认就是轮询。
问题:
状态 - 停更进维
替代方案 - Spring Cloud Loadbalancer
什么是Spring Cloud LoadBalancer
但是由于Ribbon已经进入维护模式,并且Ribbon 2并不与Ribbon 1 相互兼容,所以Spring Cloud全家桶在Spring Cloud Commons项目中,添加了Spring cloud Loadbalancer作为新的负载均衡器,并且做了向前兼容,就算你的项目中继续用 Spring Cloud Netflix 套装(包括Ribbon,Eureka,Zuul,Hystrix等等)让你的项目中有这些依赖,你也可以通过简单的配置,把Ribbon替换成Spring Cloud LoadBalancer。
实时效果反馈
1.Spring Cloud Ribbon是NetFlix发布的____。
A 网络环境
B 单点故障
C 负载均衡器
D 安全
2.Spring Cloud Ribbon替代方案是_____。
A Spring Cloud LoadBalancer
B Spring Cloud Eureka
C Spring Cloud OpenFeign
D Spring Cloud Gateway