IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring-Cloud-Eureka-01 -> 正文阅读

[Java知识库]Spring-Cloud-Eureka-01

springCloud和SpringBoot是配套的,不是所有的依赖都可以使用的,需要去官网查看相应的依赖搭配,演示使用的依赖版本是springBoot:2.3.12RELEASE springCloud:Hoxton.SR12

1、Eureka服务注册于发现

以下图片显示为eureka-cli-01和eureka-cli-02后期均改为eureka-cli-a和eureka-cli-b

1、快速使用

1.1、开启一个简单的Eureka服务

  1. 创建一个springBoot项目,前面步骤都一样,最后导入依赖如下

    在这里插入图片描述

  2. 创建完成后,我们打开pom.xml配置文件修改版本

    在这里插入图片描述

  3. 修改完成后我们去application.yml配置文件里面进行配置

    #v  eureka 默认端口号
    server:
      port: 8761
    
    # 应用名称
    spring:
      application:
        name: eureka-server
    
  4. 配置完成后,我们最后在启动类上加上注解@EnableEurekaServer就可以了

  5. 然后我们启动项目,然后就可以在控制台看到启动成功信息

    在这里插入图片描述

  6. 最后我们打开浏览器,访问http://localhost:8761就可以看到服务注册了

    在这里插入图片描述

1.2、注册一个简单的Eureka客户端

  1. 也是创建一个SpringBoot项目,但是依赖导入的需要修改

    在这里插入图片描述

  2. 创建完成后和服务端一样,手动修改下pom.xml的springboot和springcloud依赖

  3. 修改完成后,我们去application.yml配置文件进行配置

    server:
      port: 8080 # 客户端 端口号没有约束
    
    spring:
      application:
        name: eureka-cli-a
    
    # 注册的含义就是将自己的一些信息发送过去,发送到指定地址
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka
    
  4. 修改完配置文件后,在启动类增加注解@EnableEurekaClient注解,然后启动项目。

  5. 启动完成后,我们刷新服务端的页面,然后就可以看到会多出来一个服务

    在这里插入图片描述

  6. 我们使用相同的方法,再搭建一个客户端方便后面测试

    在这里插入图片描述

2、搭建客户端集群

让a这个cli起两台,就是搭建个集群操作

2.1、方法一:再创建一个项目,然后再配置文件修改端口号(项目名称和地址不修改),步骤太简单,就不操作了

2.2、方法二:复制配置文件,然后启动的时候修改端口号

  1. 在这里插入图片描述

  2. 在这里插入图片描述

  3. 在这里插入图片描述

  4. 在这里插入图片描述

  5. 修改完后,我们点击Apply,然后启动这个配置文件

    在这里插入图片描述

  6. 启动完成后,我们再次刷新页面,就可以看到我们新添加的客户端了

    在这里插入图片描述

3、Eureka配置端文件讲解

3.1、eureka-server端配置文件讲解

eureka的配置分为三类:server client 实例的

server端 server 和 实例的配置

#  eureka 默认端口号
server:
  port: 8761

# 应用名称 不要使用特殊字符
spring:
  application:
    name: eureka-server


eureka:
  server:
    eviction-interval-timer-in-ms: 10000 # 服务端间隔多少毫秒做定期删除的操作
    renewal-percent-threshold: 0.85 #续约百分比,超过85%的应用没有和你续约,那么eureka会保护服务 不会剔除任何客户端
  instance:
    hostname: localhost #主机名称 或者服务的ip
    # 主机名称 : 应用名称 : 端口号
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
    prefer-ip-address: true # 以ip的形式显示具体的服务信息
    lease-renewal-interval-in-seconds: 5 #服务实例的续约时间

  1. 配置完成后,我们关闭所有服务,然后启动当前服务

  2. 启动完成后,我们刷新页面,查看我们配置的结果

    在这里插入图片描述

3.2、eureka-cli端配置文件讲解

客户端 client 和 实例的配置

server:
  port: 8080 # 客户端 端口号没有约束

spring:
  application:
    name: eureka-cli-a

eureka:
  client:
    service-url: # 指定注册的地址
      defaultZone: http://localhost:8761/eureka
    register-with-eureka: true # 可以不往Eureka注册
    fetch-registry: true # 应用是否去拉取服务列表到本地
    registry-fetch-interval-seconds: 10 # 为了缓解服务列表的脏读问题 时间越短脏读越少  性能消耗大
  instance:
    hostname: localhost
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
    prefer-ip-address: true # 显示ip
    lease-renewal-interval-in-seconds: 10 # 实例续约的时间
  1. 配置完成后,启动项目,然后刷新页面,查看效果

    在这里插入图片描述

2、搭建Eureka-server集群

  • 去中心化模式集群中没有主从的概念

  • eureka会将数据进行广播和扩散

2.1、方法一

在搭建之前,我们要先理解,Eureka服务端,其实就是一个可以让别人注册的客户端,自己也可以注册自己

  1. 创建三个Eureka-server项目

    在这里插入图片描述

  2. 创建的步骤全部都和第一个一样,创建springboot项目,引入Eureka Server依赖,启动类加上@EnableEurekaServer注解

  3. 创建好后,我们开始一个一个修改配置文件

    1. eureka-server的配置文件

      #  eureka 默认端口号
      server:
        port: 8761
      
      # 应用名称 不要使用特殊字符
      spring:
        application:
          name: eureka-server
      
      eureka:
        client:
          service-url:
            defaultZone: http://localhost:8762/eureka,http://localhost:8763/eureka
        instance:
          hostname: localhost #主机名称 或者服务的ip
          instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
      
    2. 另外两个和这个差不多,只不过把端口 和 defaultZone的值修改一下

    3. eureka-server-b的配置文件

      #  eureka 默认端口号
      server:
        port: 8762
      
      # 应用名称 不要使用特殊字符
      spring:
        application:
          name: eureka-server
      
      eureka:
        client:
          service-url:
            defaultZone: http://localhost:8761/eureka,http://localhost:8763/eureka
        instance:
          hostname: localhost #主机名称 或者服务的ip
          instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
      
    4. eureka-server-c的配置文件

      #  eureka 默认端口号
      server:
        port: 8763
      
      # 应用名称 不要使用特殊字符
      spring:
        application:
          name: eureka-server
      
      
      eureka:
        client:
          service-url:
            defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka
        instance:
          hostname: localhost #主机名称 或者服务的ip
          instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
      
  4. 修改完配置文件后,我们依次启动项目,控制台会报错,不用管。

  5. 启动完成后,我们访问http://localhost:8761http://localhost:8762http://localhost:8763

  6. 都可以看到相同的页面

    在这里插入图片描述

  7. 但是这样并没有搭建成功,因为三个服务都是使用的localhost端口的,所以他默认会把三个服务都合为一个副本,就是DS Replicas里面的值。

  8. 我们想要在一台电脑上搭建成功,可以这样。

  9. 打开运行窗口(win+r),输入drivers打开文件夹,然后进入etc目录,对hosts文件进行编辑

  10. 在文件末尾,添加如下三行,然后保存

    127.0.0.1 peer1
    127.0.0.1 peer2
    127.0.0.1 peer3
    
  11. 保存完毕后,我们再次修改三个服务的配置文件

    1. eureka-serve配置文件

      #  eureka 默认端口号
      server:
        port: 8761
      
      # 应用名称 不要使用特殊字符
      spring:
        application:
          name: eureka-server
      
      eureka:
        client:
          service-url:
            defaultZone: http://peer2:8762/eureka,http://peer3:8763/eureka
        instance:
          hostname: peer1 #主机名称 或者服务的ip
          instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
      
    2. eureka-serve-b配置文件

      #  eureka 默认端口号
      server:
        port: 8762
      
      # 应用名称 不要使用特殊字符
      spring:
        application:
          name: eureka-server
      
      eureka:
        client:
          service-url:
            defaultZone: http://peer1:8761/eureka,http://peer3:8763/eureka
        instance:
          hostname: peer2 #主机名称 或者服务的ip
          instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
      
    3. eureka-serve-c配置文件

      #  eureka 默认端口号
      server:
        port: 8763
      
      # 应用名称 不要使用特殊字符
      spring:
        application:
          name: eureka-server
      
      
      eureka:
        client:
          service-url:
            defaultZone: http://peer1:8761/eureka,http://peer2:8762/eureka
        instance:
          hostname: peer3 #主机名称 或者服务的ip
          instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
      
  12. 修改完成后,我们再次重启项目(要先关闭,再启动),然后刷新页面可以看到如下结果

    1. http://localhost:8761/页面

      在这里插入图片描述

    2. http://localhost:8762/页面

      在这里插入图片描述

    3. http://localhost:8763/页面

      在这里插入图片描述

  13. 到此,我们的集群才算是搭建完成,集群搭建完成后,我们把一个服务注册上去,服务的配置类也需要修改,改成如下

    server:
      port: 8080
    
    spring:
      application:
        name: eureka-cli
    
    eureka:
      client:
        service-url:
          defaultZone: http://peer1:8761/eureka
        register-with-eureka: true
        fetch-registry: true
        registry-fetch-interval-seconds: 10
      instance:
        hostname: localhost
        instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
        prefer-ip-address: true
        lease-renewal-interval-in-seconds: 10
    
  14. 因为我们设置了集群,所以理论上来说,只要给一个服务注册了,其他服务也应该有的

  15. 配置完毕,重启后,刷新三个页面,查看服务是否都注册成功

    在这里插入图片描述

2.2、方法二

因为我们都是在一台电脑上起的,所以可以复制配置文件,修改端口号,起三台就可以了,步骤如下

  1. 关闭所有启动的项目,打开eureka-server的配置文件,修改如下

    #  eureka 默认端口号
    server:
      port: 8761
    
    # 应用名称 不要使用特殊字符
    spring:
      application:
        name: eureka-server
    
    eureka:
      client:
        service-url:
          defaultZone: http://peer1:8762/eureka,http://peer2:8762/eureka,http://peer3:8763/eureka
      instance:
    #    hostname: peer1 #主机名称 或者服务的ip
        instance-id: ${spring.application.name}:${server.port}
        prefer-ip-address: true
        lease-renewal-interval-in-seconds: 5
    
  2. 然后我们点击idea右上角配置,打开启动项配置

    在这里插入图片描述

  3. 我们选中左侧的第一个服务,然后点击复制,改名,改端口,依次启动就可以了

    在这里插入图片描述

  4. 在这里插入图片描述

  5. 刷新页面,查看结果

    在这里插入图片描述

3、Eureka概念理解

3.1、服务的注册

当项目启动时(eureka的客户端),就会向eureka-server发送自己的元数据(原始数据)(运行的ip,端口port,健康的状态监控等,因为使用的是http/ResuFul,请求风格),eureka-server 会在自己内部保留这些元数据(内存中)。(有一个服务列表,使用的是ConcurrentHashMap集合存放注册的服务)以restful风格,以http动词的请求方式,完成对url资源的操作。

3.2、服务的续约

项目启动成功了,除了向eureka-server注册自己成功,还会定时的向eureka-server汇报自己,心跳,表示自己还活着。(修改一个时间)

3.3、服务的下线(主动下线)

当项目关闭时,会给eureka-server报告,说明自己要下机了。

3.4、服务的剔除(被动下线,主动剔除)

当项目超过了指定时间没有向eureka-server汇报自己,那么eureka-server就会认为此节点死掉了.会把它剔除掉,也不会放流量和请求到此节点了.

3.5、Eureka运作原理的特点

Eureka-server对外提供的是restfu1风格的服务

以http动词的形式对url资源进行操作get post put delete

http服务+特定的请求方式+特定的ur1地址

只要利用这些restful我们就能对项目实现注册和发现

只不过,eureka已经帮我们使用java语言写了client,让我们的项目只要依赖client 就能实现注册和发现!

只要你会发起Http请求,那你就有可能自己实现服务的注册和发现。不管你是什么语言!

4、服务发现

通过服务的应用名称找到服务的具体实例的过程

  1. 所有开启的应用全部关闭,我们实现在客户端a中获取客户端b的信息

  2. 因为我们想要在一个客户端上调用另一个客户端的接口,所以要先获取客户端b的ip和端口,所以我们这次只需要开启一个服务,两个客户端即可,所以我们把服务端的配置文件改为原来的

    #  eureka 默认端口号
    server:
      port: 8761
    
    # 应用名称 不要使用特殊字符
    spring:
      application:
        name: eureka-server
    
    eureka:
      server:
        eviction-interval-timer-in-ms: 10000 # 服务端间隔多少毫秒做定期删除的操作
        renewal-percent-threshold: 0.85 #续约百分比,超过85%的应用没有和你续约,那么eureka会保护服务 不会剔除任何客户端
      instance:
        hostname: localhost #主机名称 或者服务的ip
        # 主机名称 : 应用名称 : 端口号
        instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
        prefer-ip-address: true # 以ip的形式显示具体的服务信息
        lease-renewal-interval-in-seconds: 5 #服务实例的续约时间
    
    
  3. 改完后启动服务,然后再把客户端b的配置文件修改回来,然后启动

    server:
      port: 8081 # 客户端 端口号没有约束
    
    spring:
      application:
        name: eureka-cli-b
    
    eureka:
      client:
        service-url: # 指定注册的地址
          defaultZone: http://localhost:8761/eureka
        register-with-eureka: true # 可以不往Eureka注册
        fetch-registry: true # 应用是否去拉取服务列表到本地
        registry-fetch-interval-seconds: 10 # 为了缓解服务列表的脏读问题 时间越短脏读越少  性能消耗大
      instance:
        hostname: localhost
        instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
        prefer-ip-address: true # 显示ip
        lease-renewal-interval-in-seconds: 10 # 实例续约的时间
    
  4. 启动成功后,刷新网页,查看是否注册成功

    在这里插入图片描述

  5. 注册成功后,我们把eureka-cli-a项目的配置文件,修改为和上面的一样,修改一下端口号和应用名称即可

    在这里插入图片描述

  6. 修改完成后,我们创建一个DiscoveryController编写代码

    package com.tcc.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cloud.client.ServiceInstance;
    import org.springframework.cloud.client.discovery.DiscoveryClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.List;
    
    /**
     * @author 宇辰
     * @date 2022/8/7 - 20:43
     **/
    @RestController
    public class DiscoveryController {
    
        @Autowired
        private DiscoveryClient discoveryClient; // springCloud定义的接口
    
        @GetMapping("test")
        public String doDiscovery(String serviceName){
            // 通过服务的应用名,找到服务的具体信息
            List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);
            instances.forEach(System.out::println);
    
            ServiceInstance serviceInstance = instances.get(0);
            String ip = serviceInstance.getHost();
            int port = serviceInstance.getPort();
            System.out.println(ip+":"+port);
    
            // 这里去找客户端02的ip和port
            return instances.get(0).toString();
    
        }
    
    }
    
  7. 编写完毕后,启动eureka-cli项目,然后在页面路径上调用接口,查看返回值,路径为http://localhost:8080/test?serviceName=eureka-cli-b

  8. 传过去的参数为b的客户端的接口,可以在服务端的页面内找到

    在这里插入图片描述

  9. 访问完毕后,查看返回值,是否为b的信息

    在这里插入图片描述

  10. 然后我们查看控制台的打印,是否获取成功

    在这里插入图片描述

  11. 有了地址和端口号,我们只需要知道接口就可以调用其他项目的接口了。

5、通过RestTemplet类发送http请求调用接口(下一章ribbon使用)

我们先新建一个restTemplet项目,引入web依赖和lombok依赖,项目端口为9090

  1. 我们先在创建个controller,然后创建几个测试接口

    package com.tcc.controller;
    
    
    import com.tcc.entity.User;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @author 宇辰
     * @date 2022/8/8 - 8:58
     **/
    @RestController
    public class TestController {
    
        @GetMapping("testGet")
        public String testGet(String name){
            System.out.println(name);
            return "OK";
        }
    
        /**
         * post传参,两种
         * json参数的核心    header content-type = application/json;charset=utf-8
         *
         * @param user
         * @return
         */
        @PostMapping("testPost1")
        public String testPost1(@RequestBody User user){
            return "姓名;" + user.getName() + ",年龄:" + user.getAge() + ",工资:" + user.getWages();
        }
    
        /**
         * 接收表单参数
         * <form action=/testPost2
         * header content-type = application/x-www-form-urlencoded
         *
         * @param user
         * @return
         */
        @PostMapping("testPost2")
        public String testPost2(User user){
            return "姓名;" + user.getName() + ",年龄:" + user.getAge() + ",工资:" + user.getWages();
        }
    
    }
    
    
    /**
    * 导入lombok依赖	内部类,也可以单独创建一个类
    **/
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    class User{
        private String name;
        private Integer age;
        private Double wages;
    }
    
  2. 创建完毕后,我们随便找个地方创建测试类,进行测试

    1. new RestTemplet创建一个发送请求的类

    2. 然后定义参数

    3. 获取返回值并打印

      • 发送get请求

        // 发送get请求
        String url = "http://localhost:9090/testGet?name=张三";
        String getTemplate = restTemplate.getForObject(url, String.class);
        System.out.println(getTemplate);
        

        在这里插入图片描述

      • 发送post请求

        String url = "http://localhost:9090/testPost1";
        User user = User.builder()
            .name("张三")
            .age(20)
            .wages(20D).build();
        String postForObject = restTemplate.postForObject(url, user, String.class);
        System.out.println(postForObject);
        

        在这里插入图片描述

      • 发送表单请求

        // 发送表单请求
        String url = "http://localhost:9090/testPost2";
        LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
        map.add("name","李四");
        map.add("age",22);
        map.add("wages",200D);
        
        String postForObject = restTemplate.postForObject(url, map, String.class);
        System.out.println(postForObject);
        

        在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 00:38:26  更:2022-09-30 00:38:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 5:26:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码