SpringCloud实现集群和负载均衡
Spring cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务的。
组成部分
spingcloud的五大神兽
服务发现——Netflix Eureka
客服端负载均衡——Netflix Ribbon/Feign
服务网关——Netflix Zuul
断路器——Netflix Hystrix
分布式配置——Spring Cloud Config
Spring cloud入门-搭建环境
1)建环境
以maven多模块化的方法搭建
2)注册中心
由于Spring Cloud为服务治理做了一层抽象接口,所以在Spring Cloud应用中可以支持多种不同的服务治理框架,比如:Netflix Eureka、Consul、Zookeeper。在Spring Cloud服务治理抽象层的作用下,我们可以无缝地切换服务治理实现,并且不影响任何其他的服务注册、服务发现、服务调用等逻辑。
3)服务提供者
4)服务消费者
1.1. 搭建环境pxm.xml配置
<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> <springboot.version>2.0.5.RELEASE</springboot.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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${springboot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
Spring cloud入门-Eureka注册中心
由于Spring Cloud为服务治理做了一层抽象接口,所以在Spring Cloud应用中可以支持多种不同的服务治理框架,比如:Netflix Eureka、Consul、Zookeeper。在Spring Cloud服务治理抽象层的作用下,我们可以无缝地切换服务治理实现,并且不影响任何其他的服务注册、服务发现、服务调用等逻辑。
Eureka是netflix的一个子模块,也是核心模块之一,Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务架构来说是非常重要的,有了 服务发现和注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务,而不需要修改服务调用的配置文件了,功能类似于dubbo的注册中心,比如zookeeper。
原理
三大角色:
Eureka server提供服务注册和发现
Eureka Server提供服务注册服务。各个服务提供者节点启动后,会在Eureka Server中进行注册,这样Eureka server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到
Service Provider服务提供方将自身服务注册到Eureka,从而使服务消费方能够找到。
Service Consumer服务消费方从Eureka获取注册服务列表,从而能够消费服务。
Eureka client是一个java客户端,用于简化eureka server的交互,在应用启动后,将会向Eureka Server发送心跳。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表把这个服务节点移除。
注册中心的搭建
创建一个普通maven项目
dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency><!--Eureka服务端支持--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
yum配置
server:port: 7001 eureka:instance:hostname: localhostclient:registerWithEureka: false #是否要注册到eurekafetchRegistry: false #表示是否从Eureka Server获取注册信息 serviceUrl:defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #单机配置
主类
@SpringBootApplication @EnableEurekaServer//标识是eureka服务端 public class EnrekaServerApplication_7001 { public static void main(String[] args) {SpringApplication.run(EnrekaServerApplication_7001.class);} }
注意事项
自我保护引发的错误
Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期,但是在保护期内如果服务刚好这个服务提供者非正常下线了,此时服务消费者就会拿到一个无效的服务实例,此时会调用失败,对于这个问题需要服务消费者端要有一些容错机制,如重试,断路器等
搭建服务提供者
在搭建服务提供者模块之前我们要创建一个模块,这个模块是公共模块,用来存放工共的数据
然后就是创建服务提供者,
pom.xml配置
<dependencies> <!--公共代码依赖--> <dependency> <groupId>cn.itsource.springcloud</groupId> <artifactId>User_interface</artifactId> <version>1.0-SNAPSHOT</version> </dependency><!--springboot支持--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency><!--eureka客户端支持 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies>
yum配置
server:port: 8001 spring:application:name: USER-PROVIDER #不要使用下划线 eureka:client:service-url:defaultZone: http://localhost:7001/eureka #告诉服务提供者要把服务注册到哪儿
程序主方法
@SpringBootApplication @EnableEurekaClient //表示是eureka的客户端 public class UserProviderApplication_8001 { public static void main(String[] args) {SpringApplication.run(UserProviderApplication_8001.class);} }
contrller层进行测试
@RestController @RequestMapping("/provider") public class UserController {// @Autowired// private IUserService userService; @RequestMapping("/user/{id}") //user/1 public User getUser(@PathVariable("id") Long id) {// 正常应该调用service获取用户,现在模拟一下 return new User(id, "zs");} }
服务消费者搭建
pom.xml配置
dependency> <groupId>cn.itsource.springcloud</groupId> <artifactId>User_interface</artifactId> <version>1.0-SNAPSHOT</version> </dependency><!--springboot支持--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency>
yml配置
server:port: 9001 spring:application:name: USER_CONSUMER
主程序
package cn.itsource.springcloud;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication public class UserConsumerAppliction_9001 { public static void main(String[] args) {SpringApplication.run(UserConsumerAppliction_9001.class);} }
测试
调用服务提供者的接口
@Configuration // <beans></beans> public class CfgBean {@Bean //<bean class="org.springframework.web.client.RestTemplate"></bean> public RestTemplate getRestTemplate(){ return new RestTemplate();} }
@RestController @RequestMapping("/consumer") public class UserController {//多个方法调用只需改一处就ok public static final String URL_PREFIX = "http://localhost:8001";@Autowired private RestTemplate restTemplate;@RequestMapping("/user/{id}") public User getUser(@PathVariable("id")Long id){ //调用远程服务 http请求 String url = URL_PREFIX+"/provider/user/"+id; return restTemplate.getForObject(url,User.class );} }
实现集群
实现集群以注册中心为例。我们新建一个操作中心,操作i方法和之前的一样,yml的配置方式变化
server:port: 7001 eureka:instance:hostname: eureka-7001.comclient:registerWithEureka: false #是否要注册到eurekafetchRegistry: false #表示是否从Eureka Server获取注册信息serviceUrl:#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #单机配置defaultZone: http://eureka-7002.com:7002/eureka/ #集群配置,如果有多个,有逗号分割,不要包含自己
7002: 模块application.yml
server:port: 7002 eureka:instance:hostname: eureka-7002.comclient:registerWithEureka: false #是否要注册到eurekafetchRegistry: false #表示是否从Eureka Server获取注册信息serviceUrl:#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #单机配置defaultZone: http://eureka-7001.com:7001/eureka/ #集群配置,如果有多个,有逗号分割,不要包含自己
映射hosts 模拟域名解析 C:\Windows\System32\drivers\etc
127.0.0.1 eureka-7001.com
127.0.0.1 eureka-7002.com
然后就是在消费端需要注意,
把8001服务提供方代码分别注册到7001和7002两个注册中心去;完成集群操作
server:port: 8001 spring:application: name: user-provider #不要使用下划线 eureka:client:service-url:#defaultZone: http://localhost:7001/eureka #告诉服务提供者要把服务注册到哪儿defaultZone: http://eureka-7001.com:7001/eureka,http://eureka-7002.com:7002/eureka instance:prefer-ip-address: true #显示客户端真实ip
负载均衡
为什么需要负载均衡
为了提供并发量,有时同一个服务提供者可以部署多个。这个客户端在调用时要根据一定的负责均衡策略完成负载调用。
1.1. Ribbon负载均衡
Ribbon是Netflix发布的云中间层服务开源项目,主要功能是提供客户端负载均衡算法。Ribbon客户端组件提供一系列完善的配置项,如,连接超时,重试等。简单的说,Ribbon是一个客户端负载均衡器,
1.1.1. 集成原理
在服务器方配置负载均衡
我们新建一个服务端和之前的一样的,然后在消费端进行配置
·
<!--eureka客户端,服务消费者也要从注册中心获取可用服务列表--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency><!--客户端负载均衡实现 ribbon--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId> </dependency>
9001消费方引入ribbon
port: 9001 eureka:client:registerWithEureka: false #不注册到Eureka,不在注册中心显示service-url:#defaultZone: http://localhost:7001/eurekadefaultZone: http://eureka-7001.com:7001/eureka,http://eureka-7002.com:7002/eureka
主方法
@SpringBootApplication @EnableEurekaClient public class UserConsumerApplicaton_9001 { public static void main(String[] args) {SpringApplication.run(UserConsumerApplicaton_9001.class);} }
新建一个类用来获取RestTemplate
@Configurationpublic class CfgBean { @Bean @LoadBalanced //开启负载均衡 public RestTemplate getRestTemplate() {return new RestTemplate(); }//随机策略 @Bean public IRule myRule(){return new RandomRule();//通过随机算法分配服务端 }}
@Configuration public class CfgBean {@Bean@LoadBalanced //开启负载均衡 public RestTemplate getRestTemplate(){ return new RestTemplate();} }@RestController @RequestMapping("/consumer") public class UserController {//多个方法调用只需改一处就ok//public static final String URL_PREFIX = "http://localhost:8001"; public static final String URL_PREFIX ="http://USER-PROVIDER"; //通过服务名从注册中心获取服务列表,通过负载均衡调用 @Autowired private RestTemplate restTemplate;@RequestMapping("/user/{id}") public User getUser(@PathVariable("id")Long id){ //调用远程服务 http请求 String url = URL_PREFIX+"/provider/user/"+id; return restTemplate.getForObject(url,User.class );} }
完后启动就能完成负载均衡
Feign负载均衡
Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。Feign整合了Ribbon和Hystrix(关于Hystrix我们后面再讲),可以让我们不再需要显式地使用这两个组件。
Feign是以接口方式进行调用,而不是通过RestTemplate来调用,feign底层还是ribbo,它进行了封装,让我们调用起来更加happy.
通过客户端进行负载均衡
新建一个客户端
pom配置
<dependencies><!--公共代码依赖--><dependency> <groupId>cn.itsource.springcloud</groupId> <artifactId>User_interface</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--springboot支持--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <!--eureka客户端,服务消费者也要从注册中心获取可用服务列表--><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--feign的支持--><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies>
配置yml
server:port: 9002 eureka:client:registerWithEureka: false #不注册到Eureka,不在注册中心显示service-url:#defaultZone: http://localhost:7001/eurekadefaultZone: http://eureka-7001.com:7001/eureka,http://eureka-7002.com:7002/eureka
主方法
@SpringBootApplication @EnableEurekaClient @EnableFeignClients(basePackages = "cn.itsource.microservice") //不在当前包下面 public class UserConsumerFeign9002Application {public static void main(String[] args) {SpringApplication.run(UserConsumerFeign9002Application.class, args);} }
写一个接口,这个接口中的方法要和服务提供者里面访问地址和参数等保持一致。
@FeignClient(value = "USER-PROVIDER") @RequestMapping("/provider") public interface UserCilent { @RequestMapping("/user/{id}") //user/1 User getUser(@PathVariable("id") Long id); }
在Controller中进行调用
@RestController @RequestMapping("/consumer") public class UserController { @Autowired private UserCilent userCilent; @RequestMapping("/user/{id}") public User getUser(@PathVariable("id")Long id){System.out.println(userCilent.getClass()); return userCilent.getUser(id);} }
转载于:https://www.cnblogs.com/xiaohuziguai/p/10793194.html
SpringCloud实现集群和负载均衡相关推荐
- 搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡
转载:https://www.cnblogs.com/xiongze520/p/10308720.html 分布式,集群,云计算机.大数据.负载均衡.高并发······当耳边响起这些词时,做为一个菜鸟 ...
- 结合Apache和Tomcat实现集群和负载均衡
http://fableking.iteye.com/blog/360870 TomcatApacheJSP应用服务器Web 本文基本参考自 轻松实现Apache,Tomcat集群和负载均衡,经由实 ...
- 使用LVS+TUN搭建集群实现负载均衡
使用LVS+TUN搭建集群实现负载均衡 TUN模式的概述与工作原理 TUN模式服务概述: IP Tunneling(IP隧道) --可以在不同地域,不同网段 Director分配请 ...
- 学习:双机热备、集群、负载均衡、SQL故障转移群集简单理解(转)
双机热备.集群.负载均衡.SQL故障转移群集简单理解平常,大家常提到几个技术名词:双机热备.集群.负载均衡.SQL故障转移群集.这里,就我的理解,和大家简单探讨下,有不足或错误之处还请各位指出! 这些 ...
- FastDFS蛋疼的集群和负载均衡(十五)之lvs四层+Nginx七层负载均衡
###Interesting things lvs+nginx的拓扑图 准备环境,基于上一篇[Diary Report 2018-1-3]关于FastDFS蛋疼的集群和负载均衡(十三)之LVS-DR环 ...
- haproxy对mysql集群进行负载均衡
haproxy对mysql集群进行负载均衡: 参考网址:https://www.cnblogs.com/jave1ove/p/5980053.html 注: mysql为集群模式,我使用的为mysql ...
- LVS集群-DR负载均衡集群
LVS集群-DR负载均衡集群 服务介绍 Director 分配请求到不同的real server. real server 处理请求后直接回应给用户,这样director 负载均衡器仅处理客户机与服务 ...
- Nginx+Tomcat集群与负载均衡
Nginx+Tomcat集群与负载均衡 架构描述 前端一台nginx服务器做负载均衡器,后端放N台tomcat组成集群处理服务,通过nginx转发到后面(注:没做动静分离,静态动态全部都转给tomca ...
- 在Linux上使用Nginx为Solr集群做负载均衡
在Linux上使用Nginx为Solr集群做负载均衡 在Linux上搭建solr集群时需要用到负载均衡,但测试环境下没有F5 Big-IP负载均衡交换机可以用,于是先后试了weblogic的proxy ...
- Nginx实现tomcat集群进行负载均衡
一.背景 随着业务量和用户数量的激增,单一的tomcat部署应用已经无法满足性能需求,而且对于每次发布项目期间服务不可用的问题也凸显,既然出现了这个问题,那么我们本文就借助nginx来完美的解决这个问 ...
最新文章
- 小区的足球场地实地拍摄
- 2009计算机统考真题,2009年计算机统考真题(完整版).PDF
- jquery 手型 鼠标穿过时_专业电竞鼠标有什么独到之处?看完核技瑞你就知道了
- 数据结构与算法 / 冒泡排序及其优化的三种方式
- Maven入门指南② :Maven 常用命令,手动创建第一个 Maven 项目
- 接口自动化测试之PHPUnit-框架代码编写2
- Underscore.js常用方法介绍
- java虚拟机工作原理图_Java虚拟机工作原理
- centOS 8+VMwware配置(2)
- R语言各个包里面的数据集
- layabox2.0 开发微信小游戏经验分享
- Understanding Deep Image Representations by Inverting Them
- 回归分析中自变量取舍、检验及多重共线性处理(VIF)
- 放牛娃谈堆排序---(为了说明白,我重新学习了如何说“人话”)
- IO中write函数
- word中鼠标没有反应,可以动但是点哪都没反应
- Kettle 通俗易懂讲明白值映射
- NFS 服务 lap1+lap2+mysql+nfs
- HDU1814 Peaceful Commission 2SAT
- 2021-2027全球与中国冰箱稳定器市场现状及未来发展趋势
热门文章
- c语言中变量的转换,C语言中,指针变量之间的类型转换
- 二叉树 -- 5.1.1 Binary Tree Level Order Traversal-1 -- 图解
- JavaScript数据类型之Number
- readhat7mysql_Redhat7.3安装MySQL8.0.22的详细教程(二进制安装)
- Spring源码之ApplicationContext(一)
- 21秋期末考试电子商务概论10250k2
- 【Python实例第11讲】文本的核外分类
- 算法与数据结构(二)-数组、链表(Array、Linked List)
- MY_0001:添加命令到自定义工具栏
- Python爬虫从入门到放弃(二十三)之 Scrapy的中间件Downloader Middleware实现User-Agent随机切换...