spring-cloud-ribbon负载均衡(二)

来源:互联网 发布:sql having count(*) 编辑:程序博客网 时间:2024/06/04 19:03

通过eureka+ribbon来实现负载均衡,ribbon是一个为客户端提供负载均衡功能的服务,它内部提供了一个叫做ILoadBalance的接口代表负载均衡器的操作。RestTemplate 构建RestTemplate对应的bean,在method上使用注解LoadBalanced表示restTemplate使用LoadBalancerClient执行请求。ribbonServerList会被DiscoveryEnabledNIWSServerList重写,扩展成从Eureka注册中心中获取服务端列表。同时它也会用NIWSDiscoveryPing来取代IPing,它将职责委托给Eureka来确定服务端是否已经启动。

1、注册发现服务

(1)application

package com.neo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@SpringBootApplication@EnableEurekaServerpublic class SpringCloudEurekaApplication {    public static void main(String[] args) {        SpringApplication.run(SpringCloudEurekaApplication.class, args);    }}

(2)properties

spring.application.name=spring-cloud-eurekaserver.port=8000eureka.client.register-with-eureka=falseeureka.client.fetch-registry=falseeureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

(3)pom.xml
这里写图片描述
注:eureka依赖了ribbon,所以不需引入ribbon的jar包

<?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">    <modelVersion>4.0.0</modelVersion>    <groupId>com.wei.qin</groupId>    <artifactId>spring-cloud-eureka</artifactId>    <version>0.0.1-SNAPSHOT</version>    <packaging>jar</packaging>    <name>spring-cloud-eureka</name>    <description>Demo project for Spring cloud eureka</description>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>1.5.3.RELEASE</version>        <relativePath/> <!-- lookup parent from repository -->    </parent>    <properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>        <java.version>1.7</java.version>        <spring-cloud.version>Dalston.RELEASE</spring-cloud.version>    </properties>    <dependencies>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-eureka-server</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>    </dependencies>    <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>    <build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>            </plugin>        </plugins>    </build></project>

2、ribbon-service

这里写图片描述
(1)corsConfig

package com.wei.qin;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.CorsRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;/** * 配置跨域访问,开发环境使用,生产环境可取消 *  * @author Davis * @date 2017年6月8日 下午5:28:59 */@Configuration  public class CorsConfig extends WebMvcConfigurerAdapter {      @Override      public void addCorsMappings(CorsRegistry registry) {          registry.addMapping("/**")                  .allowedOrigins("*")                   .allowCredentials(true)                  .allowedMethods("GET", "POST", "DELETE", "PUT")                  .maxAge(3600);      }  }  

(2)application

package com.wei.qin;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.context.annotation.Bean;import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.web.client.RestTemplate;/** *  *  * @auther dwx * * 2017年8月21日 */@SpringBootApplication@EnableDiscoveryClient public class ClientApplication {    public static void main(String[] args) {        SpringApplication.run(ClientApplication.class, args);    }     /**     * LoadBalanced 注解表明restTemplate使用LoadBalancerClient执行请求     *     * @return     */    @Bean    @LoadBalanced    public RestTemplate restTemplate() {        RestTemplate template = new RestTemplate();        SimpleClientHttpRequestFactory factory = (SimpleClientHttpRequestFactory) template.getRequestFactory();        factory.setConnectTimeout(3000);        factory.setReadTimeout(3000);        return template;    }  }

(3)ClientController

package com.wei.qin;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;@RestControllerpublic class ClientController {    @Autowired    RestTemplate client;    @RequestMapping("/test")    public String helloWorld() {        return client.getForObject("http://spring-cloud-producer/hello?name=111", String.class);    }}

注:spring-cloud-producer为其他服务的serviceid

(4)properties
默认情况下,ribbon负载均衡使用的是轮询策略,也可以自定义负载均衡策略。比如自定义随机策略:
1、在properties中加入下面代码:
ribbon-service.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
注: ribbon-service是spring.application.name

spring.application.name=ribbon-serviceserver.port=9000eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

(5)pom.xml

<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.wei.qin</groupId>  <artifactId>springcloudribbon2</artifactId>  <version>0.0.1-SNAPSHOT</version>  <packaging>jar</packaging>  <name>springcloudribbon2</name>  <url>http://maven.apache.org</url>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>1.5.3.RELEASE</version>        <relativePath/> <!-- lookup parent from repository -->    </parent>    <properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>        <java.version>1.7</java.version>        <spring-cloud.version>Dalston.RELEASE</spring-cloud.version>    </properties>    <dependencies>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-eureka</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>    </dependencies>    <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>    <build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>            </plugin>        </plugins>    </build></project>

3、其他服务spring-cloud-producer
(1)properties

spring.application.name=spring-cloud-producerserver.port=8006eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

(2)controller

package com.neo.controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class HelloController {    @RequestMapping("/hello")    public String index(@RequestParam String name) {        return "hello "+name+",this is first messge";    }}

(3)application

package com.neo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication@EnableDiscoveryClientpublic class ProducerApplication {    public static void main(String[] args) {        SpringApplication.run(ProducerApplication.class, args);    }}

这里写图片描述

这里写图片描述

这里写图片描述

原创粉丝点击