zoukankan      html  css  js  c++  java
  • spring cloud 通过 ribbon 实现客户端请求的负载均衡(入门级)

    项目结构

    环境:

    idea:2020.1 版

    jdk:8

    maven:3.6.2

    1. 搭建项目

    ( 1 )父工程:spring_cloud_demo_parent

    pom 文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <modules>
            <module>miscroservice-eureka-server</module>
            <module>miscroservice-eureka-user</module>
            <module>miscroservice-eureka-order</module>
        </modules>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.3.0.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.kevin.parent</groupId>
        <artifactId>demo_parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>demo_parent</name>
        <description>Demo project for Spring Boot</description>
        <packaging>pom</packaging>
    
        <properties>
            <java.version>1.8</java.version>
            <spring-cloud.version>Hoxton.SR4</spring-cloud.version>
        </properties>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <dependencies>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.68</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

      

    ( 2 ) 注册中心 eureka: miscroservice-eureka-server

    pom 文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>demo_parent</artifactId>
            <groupId>com.kevin.parent</groupId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>miscroservice-eureka-server</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka-server</artifactId>
                <version>1.4.7.RELEASE</version>
            </dependency>
        </dependencies>
    
    </project>  

    application.yml 文件:

    server:
      port: 8761
    eureka:
      instance:  # 实例
        hostname: localhost
      client:
        register-with-eureka: false # 不需要向自己注册
        fetch-registry: false # 不需要向自己检索
        service-url:  #注册中心访问方式
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
    

      

    ( 3 )服务提供者:miscroservice-eureka-order

    pom 文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>demo_parent</artifactId>
            <groupId>com.kevin.parent</groupId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>miscroservice-eureka-order</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
                <version>1.4.7.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
    
    </project>
    

     application.yml:

    server:
      port: 7900
    eureka:
      instance:
        prefer-ip-address: true # 是否显示主机 ip
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/
    spring:
      application:
        name: miscroservice-eureka-order
    

     ( 4 )服务消费者:miscroservice-eureka-user

    pom 文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>demo_parent</artifactId>
            <groupId>com.kevin.parent</groupId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>miscroservice-eureka-user</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
                <version>1.4.7.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-commons</artifactId>
            </dependency>
        </dependencies>
    
    </project>
    

      application.yml:

    server:
      port: 8000
    eureka:
      instance:
        prefer-ip-address: false # 是否显示主机的 ip
        instance-id: ${spring.cloud.client.ip-address}:${server.port}  # 将服务实例 id 设置为 ip:端口号形式
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/  # 指定 eureka 服务地址
    spring:
      application:
        name: miscroservice-eureka-user
    

      

    2. 编写业务代码

    ( 1 )注册中心 eureka 启动类

    package com.kevin.eureka.server;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    /**
     * @author kevin
     * @version: EurekaApplication.java v 1.0, 2020年05月21日 12:57
     * @Description
     *
     * @EnableEurekaServer 表明该服务是一个 eureka 注册中心服务
     **/
    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(EurekaApplication.class, args);
        }
    }
    

    ( 2 )服务提供者

    A. 启动类:

    package com.kevin.eureka.order;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    /**
     * @author kevin
     * @version: OrderApplication.java v 1.0, 2020年05月21日 21:43
     * @Description
     **/
    @SpringBootApplication
    @EnableEurekaClient
    public class OrderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(OrderApplication.class, args);
        }
    }
    

    B. po:

    package com.kevin.eureka.order.po;
    
    import lombok.Data;
    import lombok.ToString;
    
    import java.io.Serializable;
    
    /**
     * @author kevin
     * @version: Order.java v 1.0, 2020年05月21日 21:48
     * @Description
     **/
    @Data
    @ToString
    public class Order implements Serializable {
    
        private String id;
        private Double price;
        private String receiverName;
        private String receiverAddress;
        private String receiverPhone;
    }
    

    C. controller

    package com.kevin.eureka.order.controller;
    
    import com.alibaba.fastjson.JSON;
    import com.kevin.eureka.order.po.Order;
    import com.kevin.eureka.order.service.ServiceInfoManager;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @author kevin
     * @version: OrderController.java v 1.0, 2020年05月21日 21:51
     * @Description
     **/
    @RestController
    public class OrderController {
    
        @Autowired
        private ServiceInfoManager manager;
    
        /**
         * 通过 id 查询订单
         *
         * @param id
         * @return
         */
        @RequestMapping("/order/{id}")
        public String findOrderById(@PathVariable String id) {
            int port = manager.getPort();
            System.out.println("port = " + port);
            Order order = new Order();
            order.setId("123");
            order.setPrice(20.00);
            order.setReceiverName("小李");
            order.setReceiverAddress("北京市昌平区");
            order.setReceiverPhone("123456");
            return JSON.toJSONString(order);
        }
    }
    

    D. 获取服务端口号

    package com.kevin.eureka.order.service;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.core.env.Environment;
    import org.springframework.stereotype.Component;
    
    /**
     * @author kevin
     * @version: ServiceInfoManager.java v 1.0, 2020年05月22日 10:48
     * @Description
     **/
    @Component
    public class ServiceInfoManager {
    
        @Autowired
        private Environment env;
    
        /**
         * 获取端口号
         *
         * @return
         */
        public int getPort() {
            String s = env.getProperty("server.port");
            return Integer.parseInt(s);
        }
    }
    

    ( 3 )服务消费者:

    A. 启动类

    package com.kevin.eureka.user;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    /**
     * @author kevin
     * @version: UserApplication.java v 1.0, 2020年05月21日 13:09
     * @Description
     **/
    @SpringBootApplication
    @EnableEurekaClient
    public class UserApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(UserApplication.class, args);
        }
    }
    

    B. controller:

    package com.kevin.eureka.user.com.kevin.eureka.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    /**
     * @author kevin
     * @version: UserController.java v 1.0, 2020年05月22日 10:15
     * @Description
     **/
    @RestController
    public class UserController {
    
        public static final String ORD_URL = "http://miscroservice-eureka-order/order/";
    
        @Autowired
        private RestTemplate restTemplate;
    
        @RequestMapping("/findOrdersByUser/{id}")
        public String findOrdersByUser(@PathVariable String id) {
            String oId = "123";
            return restTemplate.getForObject(ORD_URL + oId, String.class);
    
        }
    }
    

    C. 配置类

    package com.kevin.eureka.user.com.kevin.eureka.config;
    
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;
    
    /**
     * @author kevin
     * @version: UserConfig.java v 1.0, 2020年05月22日 10:13
     * @Description
     **/
    @Configuration
    public class UserConfig {
    
        @Bean
        @LoadBalanced   // 通过 ribbon 实现客户端请求的负载均衡
        public RestTemplate createResTemp(){
            return new RestTemplate();
        }
    }
    

     

    3.  分别启动 eureka、order、user 服务

    浏览器中打开  http://localhost:8761/ ,可以看到 order、user 服务都已经注册进来

    4. 修改 order 端口号为 7901 (不要停止 order 服务)

    5. 修改idea 配置,由单一启动改为 平行启动,即 将一个服务只能启动一次 改为 可以启动多次

    选择 OrderApplication,并 勾上 Allow parallel run

     启动 OrderAoolication

    查看注册中心

    6. postman 测试

    快速按 send,查看 idea 控制台,两个服务都有请求

    端口号为 7900 的服务:

    端口号为 7901 的服务:

  • 相关阅读:
    14.从m个球中取出n个球的所有组合情况
    13.输入一个数,求1! + 3!
    centos LVM详解
    git的团队协作开发
    centos-yum离线源
    检测 HTML5CSS3JAVASCRIPT 在浏览器的适应情况
    J2EE 中 The function valueOf must be used with a prefix when a default namespace is not specified 错误
    HTML
    App签名--- Android
    ToggleButton --------- 按钮实现开关效果
  • 原文地址:https://www.cnblogs.com/wtx106/p/12936446.html
Copyright © 2011-2022 走看看