02.微服务eureka集群

1.集群

1.中心化集群 主从模式集群 a(主)—son (有主机,son信息需要一致)
— son

2.去中心化集群 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
  1. 配置文件
    ribbon:
    eager-load:
    enabled:true #ribbon只有自己时能不能服务发现
    eureka:
    enabled:true #开启对eureka的支持
    http: restTemplate使用httpUrlConnection来发请求,不支持连接池,效率低
    client: #httpClient支持连接池 效率更好
    enabled: false #
    okhttp: #也是请求工具,移动端使用,轻量级的请求

          eureka是服务发现  iRule负载均衡   ribbon承上启下    
    

你可能感兴趣的:(1024程序员节)