1.集群
1.中心化集群 主从模式集群 a(主)—son (有主机,son信息需要一致)
— son2.去中心化集群 eureka (数据在几台机器都有信息,相互注册)
2.改配置文件(集群)(在一台机器不是集群)
spring:
application:
name: eureka-server #其他集群配置这个名字不能改
eureka:
client:
service-url:
defaultZone: http://top1:8761/eureka,http://top2:8762/eureka,http://top3:8763/eureka
#server最终方案,把主机和其他全部注册进去
#改hosts变成集群
#c\windows\sys32\drivers\etc\hosts
#也可以cmd drivers
#127.0.0.1 peer3 改hostName主机名称
#client名字怎么改 写全部注册中心的名字
3.集群 主从模式,主机挂了怎么选 1.投票 2.哨兵模式
数据怎么同步 算法 paxos raft
1.分布式共识 raft
主机 int i=1 主机先不等于1,通知从机响应,大多数从机响应,主机赋值,同步从机数据,,数据同步
150ms-300ms随机时间睡眠, 快速醒的昭告天下,全部人给我投票(必须)
2. 服务续约(定时发送自己的心跳) 下线(主动) 剔除(被动,没有心跳了)
4.看源码
1.external lib 搜索eureka找到 DiscoveryClient
看方法在哪里被调用
ctr+f点方法名
在register方法 方法alt看配置文件填充的数据
2.看eureka server的 InstanceRegistry
3.ApplicationResource 暴露接口提供http服务
5.服务发现 一个服务发现另外一个服务,之间没有关系
通过服务的应用名称找到服务具体实例的过程
//在controller,使用springcloud的服务发现
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("test") //相当于 /test
public String doxxx(String serviceName){
//得到服务列表
List<ServiceInstance> instances=discoveryClient.getInstances(serviceName)
//可以得到host(ip)和port和端口
}
6.在docker 里面运行
docker run -p 端口 -d 后台运行 --link 网络host文件
-e MYSQL_ROOT_PASSWORD=123456 -v文件挂载
#-e 可以改配置文件 ,如果有大写的取大写的值,没有取后面的值
client:
service-url:
defaultZone: ${EUREKA_SERVER_URL: http://localhost:8761/eureka}
register-with-eureka: ${REGISTER_WITH_EUREKA:true}
#打成jar包,闪电按钮可以跳过 test打包
#写DockerFile
FROM openjdk:8
ENV workdir=/root/wxd/eureka-server
COPY . ${workdir} #复制所有文件到workdir中(docker)
WORKDIR . ${workdir}
EXPOSE 8761
CMD ["java","-jar","eureka-server.jar"]
#创建run.sh文件,-t打标签,切换到上一级文件夹,以路径打包
cd .. && docker build ./eureka-server -t erueka-server:1.0
#把docker文件夹里面的文件 上传到服务器 /eureka-server
#赋权限
chmod 777 run.sh
./run.sh
docker run --name eureka-server -p 8761:8761
-e 复制的变量名=false -d eureka-server:1.0
7.使用RestTemplate
//去测试类new 使用
RestTemplate restTemplate=new RestTemplate();
String url ="baidu?xxx=aaa"
//指定期望得到的数据的类型
String result =restTemplate.getForObject(url,String.class);
//去controller写get和post方法(json参数用@RequestBody)
//表单参数直接就接收 application/x-www-form-urlencoded
//得到http响应体 请求参数 响应体 状态码 报文...
ResponseEntity<String> responseEntity==restTemplate.getForEntity(url,String.class);
//post请求发送
//默认是使用Jackon转成json 传输
restTemplate.postForObject(url,user,String.class);
//特殊的,传表单参数
LinkedMultiValueMap<String,Object> map=new LinkedMultiValueMap<>();
map.add("name","tanxx");
map.add("age",26);
map.add("price",8000D); //代表是double类型的
String res=restTemplate.postForObject(url,map,String.class);
8.lb load balance负载均衡 lb:// http:// ribbon是负载均衡器
ribbon的使用架构 远程调用
1.建一个文件夹 02-ribbon pom 加项目provider-a
2.在里面选依赖 eureka web
3.yml写端口,eureka注册到中心复制instance
4.加注解 @EnableEurekaClient
5.写个 controller接口提供服务
6.写另外一个项目 provider-a 改端口,然后不改项目名,负载均衡就会在一个列表
7.写消费者 web eureka(自带ribbon) 复制配置文件
应用名称 改 consumer
8.
在启动类写个
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Autowired
private RestTemplate restTemplate;
写个controller
@GetMapping("testRibbon")
public String testRibbon(String serviceName){
//我们第一个服务提供者是provider
String res =restTemplate.getForObject("http://"+serviceName+"hello",String.class);
//把ribbon依赖加进来
//RestTemplate 加 @LoadBalanced 可以改变使用服务名调用
//过程 1.拦截请求 2.得到主机名称 3.得eureka列表 4.通过负载均衡得到ip和端口
//5.改发送请求地址 6.发请求
//!!!要发原生请求,都会走ribbon ,要重新new一个模板
RestTemplate restTemplate =new RestTemplate();
String res =restTemplate.getForObject("http://localhost:8080/hello",String.class);
}
9.写ribbon轮询 cas自旋锁 java层面无锁,短暂cpu飙升
//有多个实现类怎么办,ctrl点调用的对象,没有的显示或者父类或者父类的父类有这个方法
10.负载均衡的算法
1.轮询 请求次数 % 机器数量
2. randomrule 随机
3.权重
4.iphash
5.availabilityFilteringRule过滤掉多次故障标签并发过大的服务,剩下的服务做轮询
6.WeightedResponseTimeRule 根据响应时间设置权重来做轮询,需要统计足够的数据
7.retryRule 先轮询,访问失败在一定时间内获取服务
8.BestAvailableRule 过滤掉断路器多次故障的服务,选择访问量(并发量)小的
9.默认 ZoneAvoidanceRule 区域性能和服务可用选择服务
区间亲和轮询算法(通过key区分[ip看在哪里])
#看源码 controller
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping(“testRibbon”)
public String testRibbon(String serviceName){
ServiceInstance choose = loadBalancerClient.choose(serviceName);
return choose.toString();
}
11.怎么修改负载均衡算法
1.改配置文件 访问不同服务 在消费者写
#写提供者的名字,没有语法提示
#局部改
provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
#全局改
@Bean
public IRule myRule(){
return new RandomRule();
}
#想要自己写负载均衡算法 implements IRule
2.查看 IRule 选择一个类复制包路径
复制引用 ctrl+shift+alt+c
配置文件
ribbon:
eager-load:
enabled:true #ribbon只有自己时能不能服务发现
eureka:
enabled:true #开启对eureka的支持
http: restTemplate使用httpUrlConnection来发请求,不支持连接池,效率低
client: #httpClient支持连接池 效率更好
enabled: false #
okhttp: #也是请求工具,移动端使用,轻量级的请求
eureka是服务发现 iRule负载均衡 ribbon承上启下