SpringCloud之Ribbon

本文是基于ribbon+rest来解决SpringCloud中对Ribbon做负责均衡。

  • ribbon是一个负载均衡客户端,可以很好的控制htt和tcp的一些行为。Feign默认集成了ribbon。
  • ribbon 已经默认实现了这些配置bean:
IClientConfig ribbonClientConfig: DefaultClientConfigImpl
IRule ribbonRule: ZoneAvoidanceRule
IPing ribbonPing: NoOpPing
ServerList ribbonServerList: ConfigurationBasedServerList
ServerListFilter ribbonServerListFilter: ZonePreferenceServerListFilter
ILoadBalancer ribbonLoadBalancer: ZoneAwareLoadBalancer

二、准备工作

新建一个ribbon子工程lovin-ribbon-client,用于后面的操作。下面是主要的pom依赖

<parent>
<artifactId>lovincloud</artifactId>
<groupId>com.eelve.lovincloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>lovin-ribbon-client</artifactId>
<packaging>jar</packaging>
<name>ribbonclient</name>
<version>0.0.1</version>
<description>ribbon的client</description>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>


这里为了安全,我这里还是添加spring-boot-starter-security

server:
port: 8805
spring:
application:
name: lovinribbonclient # 服务名称
security:
basic:
enabled: true
user:
name: lovin
password: ${REGISTRY_SERVER_PASSWORD:lovin}
eureka:
client:
serviceUrl:
defaultZone: http://lovin:lovin@localhost:8881/eureka/ # 注册到的eureka服务地址


配置spring-boot-starter-security,这里为了方便我这里放开所有请求

package com.eelve.lovin.cofig;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
/**
* @ClassName SecurityConfig
* @Description TDO
* @Author zhao.zhilue
* @Date 2019/8/16 14:12
* @Version 1.0
**/
@Order(0)
public class extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().permitAll()
.and().csrf().disable();
}
}


然后向程序的ioc容器中注入一个bean: restTemplate;并通过@LoadBalanced注解表明这个restRemplate开启负载均衡的功能。

package com.eelve.lovin;z
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.web.client.RestTemplate;
/**
* @ClassName LovinRibbonClientApplication
* @Description TDO
* @Author zhao.zhilue
* @Date 2019/8/15 16:59
* @Version 1.0
**/
@SpringBootApplication
@EnableDiscoveryClient
public class LovinRibbonClientApplication {
public static void main(String[] args) {
SpringApplication.run(LovinRibbonClientApplication.class,args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
}

然后编写一个HelloService

package com.eelve.lovin.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
/**
* @ClassName HelloService
* @Description TDO
* @Author zhao.zhilue
* @Date 2019/8/15 17:02
* @Version 1.0
**/
@Service
public class HelloService {
@Autowired
RestTemplate restTemplate;
public String getHello() {
//这里的**lovineurkaclient**是我上一篇文章新建的eureka客户端的名称
return restTemplate.getForObject("http://lovineurkaclient/hello",String.class);
}
}


再编写一个HelloController

package com.eelve.lovin.controller;
import com.eelve.lovin.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName HelloController
* @Description TDO
* @Author zhao.zhilue
* @Date 2019/8/15 17:05
* @Version 1.0
**/
@RestController
public class HelloController {
@Autowired
HelloService helloService;
@RequestMapping("hello")
public String hello(){
return helloService.getHello();
}
}

三、启动测试

依次启动eureka的服务端和两个客户端,以及新建的lovin-ribbon-client

我们可以看到服务已经全部启动成功


我们可以看到服务已经全部启动成功,然后访问http://localhost:8805/hello

我们可以看到已经可以通过ribbon调到我们建立的eureka客户端了

我们可以看到已经可以通过ribbon调到我们建立的eureka客户端,再次请求接口观察返回

我们可以看到我们调到了通过ribbon负载的另外一个接口

我们可以看到我们调到了通过ribbon负载的另外一个接口了,到这里我们就已经弄好了一个简单的ribbon负载。

四、网络架构

我们可以看到我们调用的服务不再是像再上一篇文章中的直接访问对应的服务,而是通过Ribbon的负载均衡的去调用的,而且这里说明一点,Ribbon的默认机制是轮询。

目前的网络架构


版权声明:著作权归作者所有。

相关推荐

SpringCloud集成Zookeeper

Spring Cloud介绍Spring Cloud是一个基于SpringBoot实现的微服务架构开发工具。它为微服务架构中涉及的配置管理、服务治理、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式,基于http协议开发的开箱即用的微服务架构注册中心Spring Cloud 早期版本的注册中心主要使用Eureka,但在2.0过后,Netf

SpringCloud配置网关安全

网关安全 微服务整体架构图 相关功能组件 服务注册与发现:consul,etcd,zookeeper,eureka 配置中心:Spring Cloud Config,携程的阿波罗,duic OAuth2 OAuth(Open Authorization,开放授权)是为用户资源的授权定义了一个安全、开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息

STM32之寄存器访问

一般的寄存器访问需要通过读-改-写三步曲 和 位运算的清0置1来实现,但在stm32的编程中,通过利用它的一些优秀的特性如端口位设置/复位寄存BSRR、位绑定等,我们可以大大提升寄存器的访问速度和简化寄存器的操作。GPIO->ODR |= 0x10; //Pin4置1GPIO->ODR &= ~0x10; //Pin4清0 BSRR/BRR寄存器GPIO->BSRR

Kotlin:流程控制之条件语句 if 和 when

在Kotlin有两种用于判断条件的语句if 和when。if在Kotlin,if既可以是条件语句,仅仅用作条件判断,还可以是条件表达式,表达式会返回一个值。传统的条件判断if语句var max = a  if (a < b) max = b if-elsevar max:&

TypeScript:变量声明之解构赋值

解构(Destructuring)是ES6新增的特性。数组和对象(Object)的一个作用是把一些值组合打包在一起。与之相对,解构就类似把数组里的值或对象的属性解包。使用解构赋值语法可以很简便地把数组的值或对象的属性赋值给单独的变量。语法var a, b, rest; [a, b] = [10, 20]; console.log