Spring Cloud Netflix之Eureka服务消费者
Eureka服务消费者介绍
Eureka服务消费者用于发现服务和消费服务,发现服务通过Eureka Client完成,消费服务通过Ribbon完成,以实现负载均衡。在实际项目中,一个服务往往同时是服务消费者与服务提供者,所以都需要注册到注册中心统一管理。同时,本文也将一同介绍Hystrix,服务容错保护熔断技术。以及ribbon负载均衡策略,重试机制,hystrix超时配置等内容。
1、配置pom.xml,注意此处引入的spring retry。网上一些教程未引入该包,导致访问故障节点时,重试机制不生效,直接返回Connection refused连接拒绝信息。
<?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.example</groupId>
<artifactId>consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>Consumer</name>
<description>Demo project for Spring Boot</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.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.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</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、入口类初始化RestTemplate,交给Spring管理,使用@LoadBalanced注解,将其交由ribbon管理,做成拦截器,并实现负载均衡等策略。@EnableCircuitBreaker用于开启hystrix的熔断服务。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate; @EnableCircuitBreaker
@SpringBootApplication
public class ConsumerApplication { @Bean
@LoadBalanced
RestTemplate template()
{
return new RestTemplate();
} public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
3、定义HystrixServer,具备ribbon负载均衡和hystrix的熔断功能的服务。将RestTemplate注入,使用template.getForObject(url,Object)来请求服务提供者,并将返回的bady转换为Object的类型。使用@HystrixCommand(fallbackMethod = "methodName")来注解方法,指定服务降级后执行的方法。
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate; @Service
public class HystrixServer { @Autowired
RestTemplate template; @HystrixCommand(fallbackMethod = "back")
public String getHello()
{
return template.getForObject("http://client/hello", String.class);
} public String back()
{
return "client has some error!";
}
}
4、定义Controller。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class ConsumerContorller { @Autowired
HystrixServer server; @RequestMapping("/hello")
public String sayHello()
{
return server.getHello();
}
}
5、配置application.yml。
spring:
application:
name: consumer
cloud:
loadbalancer:
retry:
enabled: true
server:
port: 11120
eureka:
client:
service-url:
defaultZone: http://localhost:11110/eureka,http://localhost:11111/eureka ribbon:
ConnectTimeout: 250
ReadTimeout: 1000
OkToRetryOnAllOperations: true
MaxAutoRetriesNextServer: 2
MaxAutoRetries: 1
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 5000
配置说明
- spring.cloud.loadbalancer.retry.enabled:配置是否开启负载均衡的重试机制。2.0.2版本默认为开启状态。
- <clientname>.ribbon.ConnectTimeout:配置ribbon连接超时时间。<clientname>为服务实例名,指定了,只在当前服务实例请求下生效,也可以不指定,表示全局设置。
- <clientname>.ribbon.ReadTimeout:配置ribbon的请求超时时间。
- <clientname>.ribbon.OkToRetryOnAllOperations:true,对所有操作请求都进行重试。
- <clientname>.ribbon.MaxAutoRetriesNextServer:切换多少次实例进行重试机制。
- <clientname>.ribbon.MaxAutoRetries:对当前实例进行重试的次数。
- hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds:定义熔断机制生效的超时时间。
根据yml文件中的配置,此处当访问到故障的实例时,会再访问一次(MaxAutoRetries),当访问依旧失败时,会换一个实例访问,如果还不行,再换一个实例(MaxAutoRetriesNextServer),再不行则返回错误信息。
6、启动consumer后,访问http://localhost:11120/hello后,会看到轮询返回client1和client2的信息,负载均衡的轮询机制生效。当关掉client2后,在连接超时和重试机制下,一直访问返回client1的信息。当强制关掉client1和client2后,在重试依旧失败和熔断机制的保护作用下,返回服务降级后的client has some error信息。至此,具备负载均衡和熔断机制的消费端搭建完成。
Spring Cloud Netflix之Eureka服务消费者的更多相关文章
- SpringCloud学习笔记(2)----Spring Cloud Netflix之Eureka的使用
1. Spring Cloud Netflix Spring Cloud Netflix 是Spring Cloud 的核心子项目,是对Netflix公司一系列开源产品的封装.它为Spring Bo ...
- Spring Cloud(九)高可用的分布式配置中心 Spring Cloud Config 集成 Eureka 服务
上一篇文章,讲了SpringCloudConfig 集成Git仓库,这一篇我们讲一下SpringCloudConfig 配和 Eureka 注册中心一起使用 在分布式系统中,由于服务数量巨多,为了方便 ...
- spring cloud (四、服务消费者demo_consumer)
spring cloud (一.服务注册demo_eureka) spring cloud (二.服务注册安全demo_eureka) spring cloud (三.服务提供者demo_provid ...
- Spring Cloud 入门教程(二): 服务消费者(rest+ribbon)
在上一篇文章,讲了服务的注册和发现.在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式,一种是ribbon+r ...
- SpringCloud学习笔记(5)----Spring Cloud Netflix之Eureka的服务认证和集群
1. Eureka服务认证 1. 引入依赖 <dependency> <groupId>org.springframework.boot</groupId> < ...
- 2.Spring Cloud初相识--------Eureka服务注册与消费
前言: 1.Eureka介绍: Spring Cloud Eureka,使用Netflix Eureka来实现服务注册与发现,它既包含了服务端组件,也包含了客户端组件,并且服务端与客户端均采用Java ...
- Spring Cloud 入门教程 - Eureka服务注册与发现
简介 在微服务中,服务注册与发现对管理各个微服务子系统起着关键作用.随着系统水平扩展的越来越多,系统拆分为微服务的数量也会相应增加,那么管理和获取这些微服务的URL就会变得十分棘手,如果我们每新加一个 ...
- Spring Cloud(Dalston.SR5)--Eureka 服务实例健康检查
默认情况下,Eureka 客户端每隔 30 秒会发送一次心跳给服务器端,告知正常存活,但是,实际环境中有可能出现这种情况,客户端表面上可以正常发送心跳,但实际上服务是不可用的,例如,一个需要访问数据的 ...
- Spring Cloud(Dalston.SR5)--Eureka 服务消费
服务被注册.发布到 Eureka 服务器后,需要有程序去发现他,并且进行调用,称为服务消费,一个服务可能会部署多个实例,调用过程可能涉及负载均衡.服务器查找等问题,这些问题 Netflix 项目已经帮 ...
随机推荐
- 7.JavaCC官方入门指南-例2
例2:整数加法运算--改良版(增强语法分析器) 1.修改 上一个例子中,JavaCC为BNF生产式所生成的方法,比如Start(),这些方法默认只简单的检查输入是否匹配BNF生产式指定的规范.但是 ...
- bayaim_linux_configure_oracle
---------------------------bayaim_linux_install_oracle_11g--2.0------------------------------------- ...
- MySQL 同一Windows系统上安装多个数据库
Step 1:拷贝一份MySQL整个安装文件,并拷贝一份 my.ini 文件放置安装目录下,然后修改以下内容.注意 port 不能设置为默认的3306,这里我们设置为3307端口. basedir=C ...
- c/c++ 混合编程.so
CC = gccC++ = g++LINK = g++ LIBS = -lz -lm -lpcre#must add -fPIC optionCCFLAGS = $(COMPILER_FLAGS) - ...
- Apache(基于端口号)
1.配置服务器的IP地址 2. 创建网站数据目录 (1).分别创建端口为6111,6222的网站数据目录 (2).分别在网站数据目录中写入不同的内容 3.在配置文件中描述基于端口号的虚拟主机 (1) ...
- Node.js Koa2开发微信小程序服务端
1.promise.async.await const Koa = require('koa') const app = new Koa() // 应用程序对象 有很多中间件 // 发送HTTP KO ...
- 6.web3
http://123.206.87.240:8002/web3/
- 【Spring AOP】AOP实现原理(六)
原文链接:https://my.oschina.net/guangshan/blog/1797461
- zz《可伸缩服务架构 框架与中间件》综合
第1章 如何设计一款永不重复的高性能分布式发号器 1. 为什么不直接采用UUID? 虽然UUID能够保证唯一性,但无法满足业务系统需要的很多其他特性,比如时间粗略有序性.可反解和可制造性(说人话,就是 ...
- LG4111/LOJ2122 「HEOI2015」小Z的房间 矩阵树定理
问题描述 LG4111 题解 矩阵树定理板子题. \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; #defin ...