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调用 + 负载均衡
    作者:以罗伊
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    百度之星资格赛1001——找规律——大搬家
    HDU1025——LIS——Constructing Roads In JGShining's Kingdom
    DP(递归打印路径) UVA 662 Fast Food
    递推DP UVA 607 Scheduling Lectures
    递推DP UVA 590 Always on the run
    递推DP UVA 473 Raucous Rockers
    博弈 HDOJ 4371 Alice and Bob
    DFS(深度) hihoCoder挑战赛14 B 赛车
    Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2)
    DP(DAG) UVA 437 The Tower of Babylon
  • 原文地址:https://www.cnblogs.com/my-ordinary/p/12371070.html
Copyright © 2011-2022 走看看