springcloud
学习课程来自尚硅谷,内容图片均为笔记脑图中的技术点配图
笔记内容和个人总结均为学习视屏课程,结合自我思想编写的
目录
Eureka服务注册与发现
什么是服务治理
springcloud 封装了netflix的Eureka模块实现服务治理
在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂所以需要有一个东西去治理他,管理服务与服务之间的依赖关系,负载均衡,容错等 实现服务发现与注册
这个是有人要问了:什么时服务的注册与发现呢???
问得好,
答案:
Eureka采用了CS也就是服务器和客户端的架构模式,Eureka Server作为服务注册中心,来管理微服务,也可以理解成用springboot来开发的一个个微服务,他们在Eureka的位置就是Eureka client,他们用心跳来告诉服务端自己是可以用的
我们可以用Eureka server就可以监控各个微服务的状态,同时也有一系列的保证机制,比如心跳检测,
我们的服务提供者和消费者的例子就是这样的,
服务提供者:在启动后将把自己当前的信息,通讯地址等以别名的方式注册到注册中心也就是Eureka server中
消费者:用别名的的形式,去获取服务的信息和通讯地址,之后实现本地调用RPC调用框架的设计思想
注册中心负责管理服务之间的依赖关系(服务治理),在任何的远程RPC中都会有一个注册中心,通过注册中心来获取服务的信息和接口地址
下图是脑图中对于Eureka两大组件的作用和功能介绍
- Eureka server
- Eureka client
单项目Eurekademo
老步骤:
- 建模块
- 添加依赖pom
- yml配置文件
- 主启动类
- 业务编码
创建cloud-eureka-server7001模块
之后导入我们要用到的依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
这里Eureka的服务端新老版本也有变化
之后就是配置了yml
server:
port: 7001
eureka:
instance:
hostname: localhost #eureka服务端的实例名字
client:
register-with-eureka: false #表识不向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
之后的主启动类的编写
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class,args);
}
}
@EnableEurekaServer
加上个注解就是Eureka的服务端了,我们并不需要写什么业务员,启动之后访问
7001端口就可以看道Eureka的注册中心啦
服务的注册
cloud-provider-payment8001我们的目光回到服务提供者
Eurekashi1 C/S架构
所以我们想要将服务提供者注册道服务中心,还需要导入一个依赖,就是Eureka client的依赖抱
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
之后就是配置文件了
eureka:
client:
register-with-eureka: true
fetchRegistry: true
service-url:
defaultZone: http://localhost:7001/eureka
配置解读:
register-with-eureka:true
表示自己会被注册到服务中心fetchRegistry:true
表示自己不是服务中心,需要检索服务defaultZone
要注册的服务中心的地址
主启动类
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@EnableEurekaClient
@SpringBootApplication
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class,args);
}
}
@EnableEurekaClient
表示自己的客户端,
之后就是测试了
- 先启动注册中心
- 之后启动需要注册的注册中心
- 访问注册中心即可
微服务名称配置
Eureka的自我保护机制
出厂默认,自我保护机制是开启的
eureka.server.enable-self-preservation = true
我们可以禁用
server:
enable-self-preservation: false
eviction-interval-timer-in-ms: 2000
当Eureka一定时间内没有检测到服务的心跳或者短时间内丢失了多个服务,那么服务端就会认为是网络故障或者是一系列i意外的发生
此时不应该注销任何的服务。同时新的服务也可以继续进来,
设计哲学
好死不如赖活着
Eureka宁可保护错误的服务信息,也不会去轻易的注销服务
小测试
我们在8001的配置文件中追加一些配置
启动项目之后
过五秒关闭8001
你会发现两秒就消失了
配置生效
Eureka集群原理
Eureka集群原理说明:
搭建注册中心集群
参考我们的注册中心7001,搭建一个一模一样的注册中心
在搭建之前请去修改一下映射文件,
找到C:\Windows\System32\drivers\etc路径下的hosts文件,修改
因为我们之前使用都是一个单机的项目,我们要集群那么不能使用 localhost,他会被识别成一样的路径
我们修改一些映射
如:
- 127.0.0.1 eureka7001.com
- 127.0.0.1 eureka7002.com
本质还是localhost但是却是两个不一样的映射
导入和7001相同的依赖
之后分别修改
7001配置文件
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名字
client:
register-with-eureka: false #表识不向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://eureka7002.com:7002/eureka/ #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
7002
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com #eureka服务端的实例名字
client:
register-with-eureka: false #表识不向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://eureka7001.com:7001/eureka/ #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
集群其实就是一句话:相互守望,
之后我们还要修改一下 服务提供者 8001的注册地址,他现在同时需要注册到两个注册中心去
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
测试:
- 先要启动EurekaServer,7001/7002服务
- 再要启动服务提供者provider,8001服务
- 再要启动消费者,80
- http://localhost/consumer/payment/get/1
**注意:**记得修改服务的端口号,避免两个模块都是用7001导致服务异常
查看结果即可
支付服务提供者8001集群环境构建
同上搭建一个除了端口号和8001一抹一样的模块
cloud-provider-payment8002
配置文件修改一个端口号即可
之后修改业务代码
因为是集群,所以之后我们要做负载均衡
我们需要修改接口业务代码
8001:
8002同上
我们通过获取不同配置文件中的端口号来判断调用的是哪一个模块
之后去修改消费者80的业务代码
= 订单服务访问地址不能写死 =
改成我们的服务提供者集群的服务别名
public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
PS:一定要修改,不然无法实现负载均衡,
之后去给config中的resttemplate
的bean上加上一个注解
@LoadBalanced注解赋予RestTemplate负载均衡的能力
之后就是可以跑项目来测试了
步骤:
- 先要启动EurekaServer,7001/7002服务
- 再要启动服务提供者provider,8001/8002服务
- http://localhost/consumer/payment/get/1
- 负载均衡效果达到,8001/8002端口交替出现
- Ribbon和Eureka整合后Consumer可以直接调用服务而不用再关心地址和端口号,且该服务还有负载功能了
actuator微服务信息完善
我们的注册中心会直接暴露出我们的地址,这是我们不愿意看到了
于是乎actuator可以将信息配置
修改服务提供者的配置
instance:
instance-id: payment8001
这样就不会暴露地址,之后有需要的情况下,我们悬停现实地址
prefer-ip-address: true
完整修改的服务提供者yml
eureka:
client:
register-with-eureka: true
fetchRegistry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
instance:
instance-id: payment8001
prefer-ip-address: true
配置完成之后就可以达到不直接暴露地址也可以看到地址的效果了
服务发现Discovery
对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息
我们在服务提供者的接口中添加展示服务信息的接口
@Resource
private DiscoveryClient discoveryClient;
@GetMapping(value = "/payment/discovery")
public Object discovery(){
List<String> services = discoveryClient.getServices();
for (String element : services) {
log.info("***** element:"+element);
}
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for (ServiceInstance instance : instances) {
log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());
}
return this.discoveryClient;
}
之后再主启动类上添加注解@EnableDiscoveryClient
启动测试就可以看到服务的信息了
尾声
Eureka的两大组件和机制以及一些测试信息完善到此结束啦