zoukankan      html  css  js  c++  java
  • springcloud之eureka服务消费基本用法--笔记

    0 环境

    系统环境:win10
    编辑器:IDEA

    1 提供者提供消费接口

    首先提供者提供访问接口 然后创建消费者 消费这个访问接口
    // 提供接口
    @RestController
    public class HelloController {
        @GetMapping("/hello")
        public String hello(){
            return "hello provider";
        }
    }

    2 创建消费者&基本使用

    创建消费者需要获取provider(提供者)的接口地址 需要到eureka server中查找 先写死访问地址 慢慢解耦 这个东东到底好在哪里

    1 依赖

    添加web client依赖 一会要用到 还是创建springboot项目的方式

    2 yml配置

    spring:
      application:
        name: consumer
    
    
    server:
      port: 1301
    
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:1234/eureka

    3 消费接口

    // 下面的消费接口都需要这个
    // 以前需要添加启动注解 现在不需要添加 即可使用
        @Autowired
        DiscoveryClient discoveryClient;
    /**
        * @Description: 消费者和提供者直接连接 强耦合 未通过server
        * @Param:
        * @return:  正确 -> 返回提供者定死的hello里的返回值 失败 -> error
        * @Author: 水面行走
        * @Date: 2020/2/27
        */
        @GetMapping("/useHello")
        public String useHello(){
            // HttpURLConnection发起请求 写死provider地址
            HttpURLConnection connection = null;
    
            try {
                // 新建url openConnxxx打开连接 -> HttpURLConnection
                URL url = new URL("http://localhost:1300/hello");
                connection = (HttpURLConnection) url.openConnection();
    
                // 若是200 读取
                if (200 == connection.getResponseCode()) {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                    // 就一行的字符串 不需要遍历了
                    String s = reader.readLine();
    
                    return s;
                }
    
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return "use error";
        }

    4 启动项目

     5 消费接口改造

    /** 
        * @Description: 改造1 通过server查询需要获取提供者的信息(在上面的基础连接上进行升级改造)
        * @Param:  
        * @return:  
        * @Author: xxxxx
        * @Date: 2020/2/xx
        */
        @GetMapping("/useHello1")
        public String userHello1(){
         // 由于查询到的服务列表是一个集合 可能是集合化部署 集合中每一项就是一个实例 List
    <ServiceInstance> provider = discoveryClient.getInstances("provider"); for (ServiceInstance serviceInstance : provider) { // 获取host port stringbuffer->append追加 String host = serviceInstance.getHost(); int port = serviceInstance.getPort(); // 类似格式 http://localhost:1300/hello // 上面的写死这个格式 现在是动态获取 拼接 最后在转换 其他一样的 StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("http://") .append(host) .append(":") .append(port) .append("/hello"); System.out.println("格式转换:"+stringBuffer.toString()); HttpURLConnection connection = null; try { // 在通过tostring转化为需要的url // 新建url openConnxxx打开连接 -> HttpURLConnection URL url = new URL(stringBuffer.toString()); connection = (HttpURLConnection) url.openConnection(); // 若是200 读取 if (200 == connection.getResponseCode()) { BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); // 就一行的字符串 不需要遍历了 String s = reader.readLine(); return s; } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } return "error"; }

    6 重启项目

     7 集群化部署&简单的负载均衡

    // 为了体验负载均衡的效果 添加了一个port数值
    @RestController
    public class HelloController {
        @Value("${server.port}")
        Integer port;
    
        @GetMapping("/hello")
        public String hello(){
            return "hello provider" + port;
        }
    }
    首先修改提供者接口 打包提供者 打包成功后 定位到提供者target目录 右键打开命令行 输入java -jar xxx.jar --server.port=xxxx(启动提供者) 

     

    为了实现简单负载均衡(取余) 最好全部重启一下 开启server provider consumer(启动前 添加下面的代码) 
    /**
         * @Description: 改造2 集群式+负载均衡(取余)
         * @Param:
         * @return:
         * @Author: 
         * @Date: 2020/2/xx
         */
        @GetMapping("/useHello2")
        public String userHello2(){
            // 由于查询到的服务列表是一个集合 可能是集合化部署 集合中每一项就是一个实例
            List<ServiceInstance> provider = discoveryClient.getInstances("provider");
    //        for (ServiceInstance serviceInstance : provider) {
            int count = 0;
    //        System.out.println((count) % provider.size());
            ServiceInstance serviceInstance = provider.get((count++) % provider.size());
            // 获取host port stringbuffer->append追加
            String host = serviceInstance.getHost();
            int port = serviceInstance.getPort();
            // 类似格式 http://localhost:1300/hello
            // 上面的写死这个格式 现在是动态获取 拼接 最后在转换 其他一样的
            StringBuffer stringBuffer = new StringBuffer();
            stringBuffer.append("http://")
                    .append(host)
                    .append(":")
                    .append(port)
                    .append("/hello");
            //            System.out.println("格式转换:"+stringBuffer.toString());
    
            HttpURLConnection connection = null;
    
            try {
                // 在通过tostring转化为需要的url
                // 新建url openConnxxx打开连接 -> HttpURLConnection
                URL url = new URL(stringBuffer.toString());
                connection = (HttpURLConnection) url.openConnection();
    
                // 若是200 读取
                if (200 == connection.getResponseCode()) {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                    // 就一行的字符串 不需要遍历了
                    String s = reader.readLine();
    
                    return s;
                }
    
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
    //        }
            return "error";
        }

     

     

     3 升级改造

    2方面动手:
        http调用 --> spring提供RestTemplate
        负载均衡 --> Ribbon

    1 http调用

    http调用 将HttpURLConnection以及下面的那一段 用RestTemplate替换
    application中添加 
    ----------------------------
    
    @Bean
        RestTemplate restTemplate(){
            return new RestTemplate();
        }
    
    -----------------------------------
    @Autowired
        DiscoveryClient discoveryClient;
    @GetMapping("/useHello3")
        public String userHello3() {
            // 由于查询到的服务列表是一个集合 可能是集合化部署 集合中每一项就是一个实例
            List<ServiceInstance> provider = discoveryClient.getInstances("provider");
    //        for (ServiceInstance serviceInstance : provider) {
            int count = 0;
    //        System.out.println((count) % provider.size());
            ServiceInstance serviceInstance = provider.get((count++) % provider.size());
            // 获取host port stringbuffer->append追加
            String host = serviceInstance.getHost();
            int port = serviceInstance.getPort();
            // 类似格式 http://localhost:1300/hello
            // 上面的写死这个格式 现在是动态获取 拼接 最后在转换 其他一样的
            StringBuffer stringBuffer = new StringBuffer();
            stringBuffer.append("http://")
                    .append(host)
                    .append(":")
                    .append(port)
                    .append("/hello");
            //            System.out.println("格式转换:"+stringBuffer.toString());
            String s = restTemplate.getForObject(stringBuffer.toString(), String.class);
            return s;
        }

    2 开启负载均衡

    application中添加bean
    ----------------------------------
    @Bean
        // 负载均衡注解
        @LoadBalanced
        RestTemplate restTemplateOne(){
            return new RestTemplate();
        }
    -------------------------------------------------
    controller层添加
    ======================
    @Autowired
        DiscoveryClient discoveryClient;
    
    @Autowired
        @Qualifier("restTemplateOne")
        RestTemplate restTemplateOne;
    
    @GetMapping("/useHello4")
        public String userHello4() {
            String address = "http://provider/hello";
            String retStr = restTemplateOne.getForObject(address, String.class);
            return retStr;
        }

    3 效果

     4 小结

    给RestTemplate添加负载均衡的注解 开启它 具备了负载均衡 可以理解为RestTemplate = http调用 + 负载均衡
    作者:以罗伊
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    5 个非常实用的 vs 调试技巧
    神秘的 _DEBUG 宏从何处来?
    调试实战 —— dll 加载失败之 Debug Release 争锋篇
    Python 基础 —— 字符串 方法
    linux shell的一些技巧
    salt 一些state模块函数的使用方法记录
    salt 添加iptables的sls例子
    linux 内置函数 操作
    zabbix 自动发现 自动添加主机
    zabbix 触发器 的表达式函数
  • 原文地址:https://www.cnblogs.com/my-ordinary/p/12371070.html
Copyright © 2011-2022 走看看