不惑之年的硬件牛人转到软件自学之spring cloud:(六)一个简单的负载均衡ribbon实例

前言:笔者曾经有18年的硬件研发经验,从(1)51单片机到(2)FPGA到(3)嵌入式ARM(ARM9到CORTEX A9)全都研发设计过,产品从(1)B超的整机研发到(2)智能家居系统到(3)无线电监测机到(4)平板电脑研发到(5)路灯智能控制到(5)工业电脑均有涉及,从(1)普通的电子技术工程师到(2)副总工程师到(3)副总经理到(4)事业部总经理。。。目前已经步入不惑之年的我对于物联网技术的热衷,决定从硬件开始全面转到物联技术框架之一的spring cloud技术,把我的整个学习经历和大家一起分享,也期待在之后有更多机会和大家一起合作,探讨。

      今天是:2018年4月16日    研究主题:一个简单的负载均衡ribbon实例

      一、负载均衡结构图,注:为了和以前项目名字尽量一致,我们将以下名字分别改为:

             1、“Cjb-eureka”改为:“cjb-ribbon-eureka”;

             2、Cjb-provider”改为:“cjb-ribbon-server”;

             3、Cjb-invoker”改为:“cjb-ribbon-client”;

     


      二 、按照以上架构图,我们先进行cjb-ribbon-eureka注册中心的设计,复制之前的eureka工程,更改端口为8888,也就是更改application.properties如下:

    

      运行DemoApplication.java,并在网页中输入:http://localhost:8888/运行启动eureka注册中心,如下:

      

   三、更改服务提供者,还是以之前cjb-server为修改项目cjb-ribbon-server:

   1、修改pom.xml,增加euerka的依赖:

<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">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.example.demo</groupId>
   <artifactId>cjb-server</artifactId>
   <version>0.0.1-SNAPSHOT</version>

   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Dalston.SR1</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>
      </dependencies>
   </dependencyManagement>

   <dependencies>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-config</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-eureka</artifactId>
      </dependency>
   </dependencies>

</project>

2、将配置文件“application.properties"改为“application.yml”,使配置更加简洁,内容如下:

spring:
  application:
    name: cjb-server
eureka:
  instance:
    hostname: localhost
  client:
    serviceUrl:
      defaultZone: http://localhost:8888/eureka/

3、将“CjbApplication.java”更改为端口监测,由于我们需要输入端口才能让程序运行,所以必须做如下更改:

package com.example.demo;


import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

import java.util.Scanner;


@SpringBootApplication
@EnableEurekaClient

public class CjbApplication {

   public static void main(String[] args) {
      // 读取控制台输入作为端口参数
      Scanner scan = new Scanner(System.in);
      String port = scan.nextLine();
      // 设置启动的服务器端口
      new SpringApplicationBuilder(CjbApplication.class).properties(
            "server.port=" + port).run(args);
   }


}

运行这个应用“CjbApplication”,并输入端口号:


4、由于还需要增加一个端口,所以我们复制一个class:“Cjb1Application.class”

package com.example.demo;



import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

import java.util.Scanner;


@SpringBootApplication
@EnableEurekaClient
public class Cjb1Application {

   public static void main(String[] args) {
      // 读取控制台输入作为端口参数
      Scanner scan = new Scanner(System.in);
      String port = scan.nextLine();
      // 设置启动的服务器端口
      new SpringApplicationBuilder(Cjb1Application.class).properties(
            "server.port=" + port).run(args);
   }


}

运行这个应用“CjbApplication”,并输入端口号8081:


5、在注册中心eureka中查看,新增两个端口的服务cjb-ribbon-server:


四、修改cjb-ribbon-client的配置内容:

 1、修改依赖文件pom.xml增加ribbon:

<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">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.example.demo</groupId>
   <artifactId>cjb-ribbon-client</artifactId>
   <version>0.0.1-SNAPSHOT</version>

   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Dalston.SR1</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>
      </dependencies>
   </dependencyManagement>

   <dependencies>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-config</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-eureka</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-ribbon</artifactId>
      </dependency>
   </dependencies>

</project>

2、修改配置文件application.yml为:

server:
  port: 8100
spring:
  application:
    name: cjb-ribbon-client
  cloud:
    loadbalancer:
      retry: false
eureka:
  instance:
    hostname: localhost
  client:
    serviceUrl:
      defaultZone: http://localhost:8888/eureka/

3、建立主文件main,与之前建立的一样,没有多大区别:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class CjbClient {

   public static void main(String[] args) {
      SpringApplication.run(CjbClient.class, args);
   }
}

4、建立访问路径文件Cjbcontroller.class,如下:

package com.example.demo;


import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@Configuration
public class Cjbcontroller {

   @LoadBalanced
   @Bean
   public RestTemplate getRestTemplate() {
      return new RestTemplate();
   }

   @RequestMapping(value = "/router", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
   public String router() {
      RestTemplate restTpl = getRestTemplate();
      // 根据名称调用服务
      String json = restTpl.getForObject("http://cjb-ribbon-server/person/1",
            String.class);
      return json;
   }


   
}

以上的意思是:为RestTemplate加入了@LoadBalanced修饰,增加负载均衡的调用,并用@Bean写入spring的容器,采用路径:“/router”用GET的方式调用注册的两个“cjb-ribbon-server”的服务,从而获取json数据,首先我们看一下注册中心里面cjb-ribbon-client有没有注册成功:


OK,已经注册成功了。

其次,我们通过http://localhost:8100/router来访问cjb-ribbon-server/person/1里面的数据,下面就是我们见证奇迹的时候了,如下图:

点第一下,访问的是:http://localhost:8080/person/1


点第二下(即按刷新),访问的是:http://localhost:8081/person/1


按照此顺序依次点击,会分别依顺序访问8080和8081端口的服务,这个就实现了负载均衡的目的。OK,大工告成!

五、如果需要完整代码的朋友,可以加入作者QQ群:智物联的spring cloud,入群说明:spring cloud代码需求


     





猜你喜欢

转载自blog.csdn.net/weixin_38638578/article/details/79962041