学习课程来自尚硅谷,内容图片均为笔记脑图中的技术点配图 笔记内容和个人总结均为学习视屏课程,结合自我思想编写的
什么是服务治理 springcloud 封装了netflix的Eureka模块实现服务治理 在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂所以需要有一个东西去治理他,管理服务与服务之间的依赖关系,负载均衡,容错等 实现服务发现与注册
这个是有人要问了:什么时服务的注册与发现呢??? 问得好,
答案: Eureka采用了CS也就是服务器和客户端的架构模式,Eureka Server作为服务注册中心,来管理微服务,也可以理解成用springboot来开发的一个个微服务,他们在Eureka的位置就是Eureka client,他们用心跳来告诉服务端自己是可以用的 我们可以用Eureka server就可以监控各个微服务的状态,同时也有一系列的保证机制,比如心跳检测, 我们的服务提供者和消费者的例子就是这样的, 服务提供者:在启动后将把自己当前的信息,通讯地址等以别名的方式注册到注册中心也就是Eureka server中 消费者:用别名的的形式,去获取服务的信息和通讯地址,之后实现本地调用RPC调用框架的设计思想 注册中心负责管理服务之间的依赖关系(服务治理),在任何的远程RPC中都会有一个注册中心,通过注册中心来获取服务的信息和接口地址
下图是脑图中对于Eureka两大组件的作用和功能介绍
老步骤:
创建cloud-eureka-server7001模块
之后导入我们要用到的依赖
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
com.atguigu.springcloud
cloud-api-commons
${project.version}
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-devtools
runtime
true
org.projectlombok
lombok
org.springframework.boot
spring-boot-starter-test
test
junit
junit
这里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的依赖抱
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
之后就是配置文件了
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.server.enable-self-preservation = true
我们可以禁用
server:
enable-self-preservation: false
eviction-interval-timer-in-ms: 2000
当Eureka一定时间内没有检测到服务的心跳或者短时间内丢失了多个服务,那么服务端就会认为是网络故障或者是一系列i意外的发生
此时不应该注销任何的服务。同时新的服务也可以继续进来,
设计哲学 好死不如赖活着 Eureka宁可保护错误的服务信息,也不会去轻易的注销服务
小测试
我们在8001的配置文件中追加一些配置
启动项目之后
过五秒关闭8001
你会发现两秒就消失了
配置生效
Eureka集群原理说明:
参考我们的注册中心7001,搭建一个一模一样的注册中心
在搭建之前请去修改一下映射文件,
找到C:\Windows\System32\drivers\etc路径下的hosts文件,修改
因为我们之前使用都是一个单机的项目,我们要集群那么不能使用 localhost,他会被识别成一样的路径
我们修改一些映射
如:
本质还是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 #集群版
测试:
**注意:**记得修改服务的端口号,避免两个模块都是用7001导致服务异常
查看结果即可
同上搭建一个除了端口号和8001一抹一样的模块
cloud-provider-payment8002
配置文件修改一个端口号即可
之后修改业务代码
因为是集群,所以之后我们要做负载均衡
我们需要修改接口业务代码
8001:
8002同上
我们通过获取不同配置文件中的端口号来判断调用的是哪一个模块
之后去修改消费者80的业务代码
= 订单服务访问地址不能写死 =
改成我们的服务提供者集群的服务别名
public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
PS:一定要修改,不然无法实现负载均衡,
之后去给config中的resttemplate
的bean上加上一个注解
@LoadBalanced注解赋予RestTemplate负载均衡的能力
之后就是可以跑项目来测试了
步骤:
我们的注册中心会直接暴露出我们的地址,这是我们不愿意看到了
于是乎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
配置完成之后就可以达到不直接暴露地址也可以看到地址的效果了
对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息
我们在服务提供者的接口中添加展示服务信息的接口
@Resource
private DiscoveryClient discoveryClient;
@GetMapping(value = "/payment/discovery")
public Object discovery(){
List services = discoveryClient.getServices();
for (String element : services) {
log.info("***** element:"+element);
}
List 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的两大组件和机制以及一些测试信息完善到此结束啦