前言
注册中心简介
我们的ip,url写死了
务提供者(Server):⼀次业务中,被其它微服务调⽤的服务.也就是提供接⼝给其它微服务.
服务消费者(Client):⼀次业务中,调⽤其它微服务的服务.也就是调⽤其它微服务提供的接⼝.
服务注册中⼼(Registry):⽤于保存Server的注册信息,当Server节点发⽣变更时,Registry会同步变更.服务与注册中⼼使⽤⼀定机制通信,如果注册中⼼与某服务⻓时间⽆法通信,就会注销该实例.
服务注册:服务提供者在启动时,向Registry注册⾃⾝服务,并向Registry定期发送⼼跳汇报存活状态.
服务发现:服务消费者从注册中⼼查询服务提供者的地址,并通过该地址调⽤服务提供者的接⼝.服务发现的⼀个重要作⽤就是提供给服务消费者⼀个可⽤的服务列表.
CAP理论
⼀致性(Consistency) CAP理论中的⼀致性,指的是强⼀致性.所有节点在同⼀时间具有相同的数据
可⽤性(Availability)保证每个请求都有响应(响应结果可能不对)
分区容错性(PartitionTolerance)当出现⽹络分区后,系统仍然能够对外提供服务
强一致性返回的数据是最新的,保证最新的话,可能会停止服务
Eureka就是注册中心
1.5 常⻅的注册中⼼
- Zookeeper
Zookeeper的官⽅并没有说它是⼀个注册中⼼,但是国内Java体系,⼤部分的集群环境都是依赖Zookeeper来完成注册中⼼的功能. - Eureka
Eureka是Netflix开发的基于REST的服务发现框架,主要⽤于服务注册,管理,负载均衡和服务故障转移.
官⽅声明在Eureka2.0版本停⽌维护,不建议使⽤.但是Eureka是SpringCloud服务注册/发现的默认实现,所以⽬前还是有很多公司在使⽤. - Nacos
Nacos是SpringCloudAlibaba架构中重要的组件,除了服务注册,服务发现功能之外,Nacos还⽀持
配置管理,流量管理,DNS,动态DNS等多种特性.
搭建注册中心
Eureka-server是一个独立的微服务
我们备份一份
然后进入这个新的文件夹,修改pom
然后改一下这个
然后父子项目里面的pom里面的parent的artifactid也要修改为这个为eureka
记得删除target目录
搭建注册中心
加入eureka的服务端server的依赖,注意是server版本的哦
然后就是加入maven打包的依赖
这不是一个springweb的项目,所以不引入其他东西
总共就这些东西
然后就是配置文件了
# Eureka相关配置
# Eureka 服务
server:
port: 10010
spring:
application:
name: eureka-server
eureka:
instance:
hostname: localhost
client:
fetch-registry: false # 表示是否从Eureka Server获取注册信息,默认为true.因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这里设置为false
register-with-eureka: false # 表示是否将自己注册到Eureka Server,默认为true.由于当前应用就是Eureka Server,故而设置为false.
service-url:
# 设置与Eureka Server的地址,查询服务和注册服务都需要依赖这个地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
然后就是启动类了
记得加上注解EnableEurekaServer,开启注册中心
直接输入这个就可以访问了
服务注册和服务发现的实现
服务注册
就是这个product-service项目
就是加入这个依赖,注意是client版本的
增加配置
#Eureka Client
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10010/eureka/
然后还要配置这个应用的名称
设置为product-service
然后重新启动这个注册服务,和注册中心服务
然后这个页面就有新的信息了
113.54.255.194:product-service:9090
113.54.255.194是应用名称,product-service是刚刚设置的应用名称,端口号为9090
服务发现
也是配置应用名称和eureka
然后就是修改service代码了
我们要引入DiscoveryClient这个对象,这个对象是SpringCloud中的东西
我们修改完之后测试一下
启动这个服务
这样eureka就多了一个服务了
说明我们成功了
Eureka和Zookeeper区别
Eureka和Zookeeper都是⽤于服务注册和发现的⼯具,区别如下:
- Eureka是Netflix开源的项⽬,⽽Zookeeper是Apache开源的项⽬.
- Eureka基于AP原则,保证⾼可⽤,Zookeeper基于CP原则,保证数据⼀致性.
- Eureka每个节点都是均等的,Zookeeper的节点区分Leader和Follower或Observer,也正因为这个原因,如果Zookeeper的Leader发⽣故障时,需要重新选举,选举过程集群会有短暂时间的不可⽤
负载均衡
一个应用往往都是多实例部署的
怎么多实例部署呢
就是一个端口号,但是可以启动多个应用实例
点到服务窗口
然后点添加服务
点击运行配置
选择springboot
右键复制配置
修改名称,然后选择修改选项
选择这个
然后输入-Dserver.port=9091
然后在复制一个9092的
右键然后把这两个run起来
我们发现在eureka中9091,和9092都显示出来了
我们多刷新几次请求
发现拿到的都是9092
另外两个就浪费了
我们在代码中获取的服务列表和eureka中的服务列表是不一致的
代码中9092是第一个,但是在eureka网站中9090是第一个
因为每次请求,都第一个都是不确定的
这个就一点都不均衡
实例数可以size得到,
请求计数器是一个多线程的情况
写一个AtomicInteger这个对象就可以计算线程数目了
然后我们把instances单独拿出来
//为什么要把instances单独拿出来,因为如果这块代码写在方法中,那么不能保证eureka给我们返回的结果是不变的,第一次可能是012,第二次就可能是120了,这样可能多次都请求同一个了
这样写的缺点就是service方发生变化的时候,无法感知,因为一直都不变了
然后就是重启服务了
这样就是交替的了
这个就是负载均衡
负载均衡介绍
init中获取实例列表是在程序启动出获取的,万一程序变了,或者下线了,这个是无法感知的,所以这个负载均衡不好,我们可以用负载均衡器
服务端负载均衡器nginx,也就是service就是服务端
客户端负载均衡SpringCloudLoadBalancer,也就是order就是客户端
客户端负载均衡就是在客户端负载均衡,决定去哪个服务器
服务端负载均衡就是在一个负载均衡器中决定去哪个服务器
SpringCloud LoadBalancer使用
我们在这个RestTemplate上面加上LoadBalanced注解
然后修改远程调用代码
我们用SpringCloud帮我们实现负载均衡,所以就不用自己用计数器实现了
我们把127.0.0.1:9090改为应用名称就可以了
我们直接这样写就可以了
ip+端口号变应用名称
因为url为应用名称,所以看不到端口号了
然后我们发现每个product都会打印日志
这样就成功了
负载均衡策略
就是按照什么规则来负载分配
一种是轮询:–》默认
一个是随机请求
如果要使用随机请求
官网
创建一个这个新的类
这样就可以了,这就是一个自定义的负载均衡策略
因为只有一个自定义策略
所以加上注解LoadBalancerClient
不然加上注解LoadBalancerClients
这样负载均衡访问的product就是随机的了
先配置自定义负载均衡策略,然后配置,对哪个应用生效,这个应用的负载均衡策略是什么
服务部署
就是部署在linux上
mysql -uroot -p
然后就是执行sql了,执行很多的sql,建库建表
然后就是修改配置文件了
因为不同的平台密码不同,所以我们在pom里面配置多平台
我们增加一个profiles的标签
然后就是复制多个配置文件
修改密码
主要是修改prod的密码,这个是Linux上的MySQL密码
然后是修改主配置文件
写这个意思就是让哪个配置文件生效
先配置maven,然后是主配置文件,修改prod密码
然后是order服务的修改,也是一样的
然后就是eureka的配置不用改了
然后就是打包了
勾选prod
然后就是分别对三个小的服务进行打包上传
root@hcss-ecs-6fa6:~# mkdir spring_cloud
root@hcss-ecs-6fa6:~# cd spring_cloud/
然后把打的包全部放在这里面
ll
然后就是启动程序了
先创建一个日志文件夹来存储日志
mkdir logs
先创建这个文件夹,不然运行不了
nohup java -jar eureka-server.jar > logs/eureka.log &
nohup java -jar order-service.jar > logs/order.log &
nohup java -jar product-service.jar > logs/product-9090.log &
在启动多个product
nohup java -jar product-service.jar --server.port=9091 > logs/product-9091.log &
nohup java -jar product-service.jar --server.port=9092 > logs/product-9092.log &
然后就是开发这些端口号
10010,9090,9091,9092
注意名字server与service
我们先停掉8080端口
sudo lsof -i :8080
sudo kill -9 pid
注意注意,如果密码以@开头的话,一定要加上引号,如果只是普通的字符串可以不加上引号,就是在prod的配置文件中,还有就是纯数字的话,也要加上引号
没有显示exit就是正确的
这样就成功了