spring cloud之服务发现和均衡负载

一、认识

1. Monolith(单体应用)架构

在编译时,这些项目将被打包成为一个个JAR包,并最终合并在一起形成一个WAR包。

最终部署的时候只有一份war包,其他的以jar包的方式依赖来.

缺点:在项目很小的情况下这种单体应用比较简单,但是随着项目越变越大,代码越来越多。就会存在以下缺点。

①编译难,部署难,测试难    ②技术选择难    ③扩展难

单体应用中多个模块的负载不均衡,我们扩容高负载的时候,也把低负载的模块也扩容,极大浪费了资源.

2.MicroService(微服务)架构

微服务就是把一个单体项目,拆分为多个微服务,每个微服务可以独立技术选型,独立开发,独立部署,独立运维.并且多个服务相互协调,相互配合,最终完成用户的价值.

优势:

独立部署、技术选型灵活、容错、扩展、

3.springcloud

Spring Cloud是一系列框架的有序集合。

通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

五大神兽:

服务发现——Netflix Eureka

客服端负载均衡——Netflix Ribbon/Feign

服务网关——Netflix Zuul

断路器——Netflix Hystrix

分布式配置——Spring Cloud Config

二、springcloud入门之服务发现

以maven多模块化的方法搭建

1.搭建maven项目  springcloud_parent

1.1.配置pom.xml

 1     <!-- 指定版本-->
 2     <properties>
 3         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 4         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 5         <java.version>1.8</java.version>
 6         <spring-cloud.version>Finchley.SR1</spring-cloud.version>
 7         <springboot.version>2.0.5.RELEASE</springboot.version>
 8     </properties>
 9
10     <dependencyManagement>
11         <dependencies>
12             <dependency>
13                 <groupId>org.springframework.cloud</groupId>
14                 <artifactId>spring-cloud-dependencies</artifactId>
15                 <version>${spring-cloud.version}</version>
16                 <type>pom</type>
17                 <scope>import</scope>
18             </dependency>
19             <dependency>
20                 <groupId>org.springframework.boot</groupId>
21                 <artifactId>spring-boot-dependencies</artifactId>
22                 <version>${springboot.version}</version>
23                 <type>pom</type>
24                 <scope>import</scope>
25             </dependency>
26         </dependencies>
27     </dependencyManagement>

2.单机注册中心搭建  springcloud_eureka_7001

2.1配置pom.xml

 1     <dependencies>
 2         <!--springboot支持-->
 3         <dependency>
 4             <groupId>org.springframework.boot</groupId>
 5             <artifactId>spring-boot-starter-web</artifactId>
 6         </dependency>
 7         <dependency>
 8             <groupId>org.springframework.boot</groupId>
 9             <artifactId>spring-boot-starter-test</artifactId>
10         </dependency>
11
12         <!--Eureka服务端支持-->
13         <dependency>
14             <groupId>org.springframework.cloud</groupId>
15             <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
16         </dependency>
17     </dependencies>

2.2 配置application.yml

 1 server:
 2   port: 7001
 3 eureka:
 4   instance:
 5     hostname:  eureka-7001.com
 6   client:
 7     registerWithEureka: false #作为一个注册中心不需要注册自己是否要注册到eureka
 8     fetchRegistry: false #表示是否从Eureka Server获取注册信息
 9 serviceUrl:
10   #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #单机配置
11   defaultZone: http://eureka-7002.com:7002/eureka/ #集群配置,如果有多个,有逗号分割,不要包含自己1

2.3启动项

1 @SpringBootApplication
2 @EnableEurekaServer//标识注册中心
3 public class EurekaServerApp_7001 {
4     public static void main(String[] args) {
5         SpringApplication.run(EurekaServerApp_7001.class);
6     }
7 }

2.4效果图  访问  localhost:7001

Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期,但是在保护期内如果服务刚好这个服务提供者非正常下线了,此时服务消费者就会拿到一个无效的服务实例,此时会调用失败,对于这个问题需要服务消费者端要有一些容错机制,如重试,断路器等。

3.服务提供者  springcloud_provider_8001

3.1配置pom.xml

 1     <dependencies>
 2         <!--公共代码依赖-->
 3         <dependency>
 4             <groupId>cn.su</groupId>
 5             <artifactId>user_interface</artifactId>
 6             <version>1.0-SNAPSHOT</version>
 7         </dependency>
 8
 9         <!--springboot支持-->
10         <dependency>
11             <groupId>org.springframework.boot</groupId>
12             <artifactId>spring-boot-starter-web</artifactId>
13         </dependency>
14         <dependency>
15             <groupId>org.springframework.boot</groupId>
16             <artifactId>spring-boot-starter-test</artifactId>
17         </dependency>
18
19         <!--eureka客户端支持 -->
20         <dependency>
21             <groupId>org.springframework.cloud</groupId>
22             <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
23         </dependency>
24     </dependencies>

3.2  配置 application.yml

 1 server:
 2   port: 8001
 3 spring:
 4   application:
 5     name: USER-PROVIDER #不要使用下划线
 6 eureka:
 7   client:
 8     service-url:
 9       defaultZone: http://eureka-7001.com:7001/eureka,http://eureka-7002.com:7002/eureka
10       #defaultZone: http://localhost:7001/eureka
11   instance:
12     prefer-ip-address: true #告诉服务提供者要把服务注册到哪儿

3.3 配置提供者服务方法  UserController

1 @RestController
2 @RequestMapping("/provider")
3 public class UserController {
4
5     @RequestMapping("/user/{id}")
6     public User getUser(@PathVariable("id") Long id) {
7         return new User(id, "8001su");
8     }
9 }

3.4启动项

1 @SpringBootApplication
2 @EnableEurekaClient
3 public class UserServerProviderApp_8001 {
4
5     public static void main(String[] args) {
6         SpringApplication.run(UserServerProviderApp_8001.class);
7     }
8 }

3.5 效果图

4.服务消费者  springcloud_consumer_9001

4.1准备domain模块 user_interface

1 public class User {
2     private Long id;
3     private String name;
4
5     //省略构造器和get、set
6 }

4.2配置pom.xml

 1   <dependencies>
 2         <!--公共代码依赖-->
 3         <dependency>
 4             <groupId>cn.su</groupId>
 5             <artifactId>user_interface</artifactId>
 6             <version>1.0-SNAPSHOT</version>
 7         </dependency>
 8
 9         <!--springboot支持-->
10         <dependency>
11             <groupId>org.springframework.boot</groupId>
12             <artifactId>spring-boot-starter-web</artifactId>
13         </dependency>
14         <dependency>
15             <groupId>org.springframework.boot</groupId>
16             <artifactId>spring-boot-starter-test</artifactId>
17         </dependency>
18         <!--eureka客户端,服务消费者也要从注册中心获取可用服务列表-->
19         <dependency>
20             <groupId>org.springframework.cloud</groupId>
21             <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
22         </dependency>
23         <!--客户端负载均衡实现 ribbon-->
24         <dependency>
25             <groupId>org.springframework.cloud</groupId>
26             <artifactId>spring-cloud-starter-ribbon</artifactId>
27         </dependency>
28         <dependency>
29             <groupId>org.springframework.cloud</groupId>
30             <artifactId>spring-cloud-starter-config</artifactId>
31         </dependency>
32     </dependencies>

4.3 配置application.yml

 1 server:
 2   port: 9001
 3 spring:
 4   application:
 5     name: USER_CONSUMER
 6 eureka:
 7   client:
 8     registerWithEureka: false #不注册到Eureka,不在注册中心显示
 9     service-url:
10       #defaultZone: http://localhost:7001/eureka
11       defaultZone: http://eureka-7001.com:7001/eureka,http://eureka-7002.com:7002/eureka

4.4配置类

1 @Configuration
2 public class CfgBean {
3
4     @Bean
5     public RestTemplate getRestTemplate(){
6         return new RestTemplate();
7     }
8 }

4.5userController

 1 @RestController
 2 @RequestMapping("/consumer")
 3 public class UserController {
 4
 5     @Autowired
 6     private RestTemplate restTemplate;
 7
 8     @RequestMapping("/user/{id}")
 9     public User getUser(@PathVariable("id") Long id){
10        String url="http://localhost:8001/provider/user/"+id;
11        //String url="http://USER-PROVIDER/provider/user/"+id;
12        return restTemplate.getForObject(url, User.class);
13     }
14 }

4.6启动项

1 @SpringBootApplication
2 @EnableEurekaClient
3 public class UserConsumerApp_9001 {
4     public static void main(String[] args) {
5         SpringApplication.run(UserConsumerApp_9001.class);
6     }
7 }

4.5效果图

三、springcloud 入门之 负载均衡

方法一:客户端负载均衡实现 ribbon

1.1写一个类配置负载均衡

 1 @Configuration
 2 public class CfgBean {
 3
 4     @Bean
 5     @LoadBalanced//负载均衡  轮循
 6     public RestTemplate getRestTemplate(){
 7         return new RestTemplate();
 8     }
 9
10     //负载均衡配置
11     @Bean
12     public IRule myRule(){
13         return new RandomRule();//随机算法替换轮训
14     }
15 }

1.2 userController

 1 @RestController
 2 @RequestMapping("/consumer")
 3 public class UserController {
 4
 5     @Autowired
 6     private RestTemplate restTemplate;
 7
 8     @RequestMapping("/user/{id}")
 9     public User getUser(@PathVariable("id") Long id){
10        //String url="http://localhost:8001/provider/user/"+id;
11        String url="http://USER-PROVIDER/provider/user/"+id;
12        return restTemplate.getForObject(url, User.class);
13     }
14 }

方法二:feign

2.1创建maven模块 springcloud_consumer_9002

2.2.配置pom.xml

 1 <dependencies>
 2         <!--公共代码依赖-->
 3         <dependency>
 4             <groupId>cn.su</groupId>
 5             <artifactId>user_interface</artifactId>
 6             <version>1.0-SNAPSHOT</version>
 7         </dependency>
 8
 9         <!--springboot支持-->
10         <dependency>
11             <groupId>org.springframework.boot</groupId>
12             <artifactId>spring-boot-starter-web</artifactId>
13         </dependency>
14         <dependency>
15             <groupId>org.springframework.boot</groupId>
16             <artifactId>spring-boot-starter-test</artifactId>
17         </dependency>
18
19         <!--eureka客户端,服务消费者也要从注册中心获取可用服务列表-->
20         <dependency>
21             <groupId>org.springframework.cloud</groupId>
22             <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
23         </dependency>
24
25         <!--feign的支持-->
26         <dependency>
27             <groupId>org.springframework.cloud</groupId>
28             <artifactId>spring-cloud-starter-openfeign</artifactId>
29         </dependency>
30     </dependencies>

2.3.配置application.yml

 1 server:
 2   port: 9002
 3 spring:
 4   application:
 5     name: USER_CONSUMER
 6 eureka:
 7   client:
 8     registerWithEureka: false #不注册到Eureka,不在注册中心显示
 9     service-url:
10       #defaultZone: http://localhost:7001/eureka
11       defaultZone: http://eureka-7001.com:7001/eureka,http://eureka-7002.com:7002/eureka

2.4配置接口 UserInterface实现负载均衡

1 @FeignClient(value = "USER-PROVIDER")
2 @RequestMapping("/provider")
3 public interface UserInterface {
4
5     @RequestMapping("/user/{id}")
6     public User gertUser(@PathVariable("id") Long id);
7 }

2.5写userController

 1 @RestController
 2 @RequestMapping("/consumer")
 3 public class UserController {
 4
 5     @Autowired
 6     private UserInterface userInterface;
 7
 8     @RequestMapping("/user/{id}")
 9     public User getUser(@PathVariable("id") Long id){
10         System.out.println(userInterface.getClass());
11         return userInterface.gertUser(id);
12     }
13 }

2.6启动项   注意需要扫描

1 @SpringBootApplication
2 @EnableFeignClients(basePackages ="cn.su.feign")
3 public class UserConsumerApp_9002 {
4     public static void main(String[] args) {
5         SpringApplication.run(UserConsumerApp_9002.class);
6     }
7 }

原文地址:https://www.cnblogs.com/guangbin0125/p/10793622.html

时间: 2024-10-08 04:37:57

spring cloud之服务发现和均衡负载的相关文章

Spring Cloud Ribbon---微服务调用和客户端负载均衡

前面分析了Eureka的使用,作为服务注册中心,Eureka 分为 Server 端和 Client 端,Client 端作为服务的提供者,将自己注册到 Server 端,Client端高可用的方式是使用多机部署然后注册到Server,Server端为了保证服务的高可用,也可以使用多机部署的方式.前面简单搭建了Eureka Client 和 Server,然后将Client成功注册到 Server,本节我们将来看看如何调用Eureka服务,在多机部署情况下如何保证负载均衡.Spring Clou

Spring Cloud Consul—服务发现与Consul

服务发现是基于微服务架构的关键原则之一.尝试配置每个客户端或某种形式的约定可能非常困难,可以非常脆弱.Consul通过HTTP API和DNS提供服务发现服务.Spring Cloud Consul利用HTTP API进行服务注册和发现.这不会阻止非Spring Cloud应用程序利用DNS界面.Consul代理服务器在通过八卦协议进行通信的集群中运行,并使用Raft协议协议. 如何激活 要激活Consul服务发现,请使用组org.springframework.cloud和artifact i

Spring Cloud 2-Eureka服务发现注册(一)

Spring Cloud Eureka 1.服务端配置 pom.xml application.yml Application.java 2.客户端配置 pom.xml application.yml 新建HelloController.java 3.优化pom引用 父项目:spring-cloud-base 子项目:eureka-server修改如下 子项目:eureka-client修改如下 1.服务端配置 使用Spring Boot 2.0.2.RELEASE和Spring Cloud F

构建微服务架构Spring Cloud:服务注册与发现(Eureka、Consul)

Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等操作提供了一种简单的开发方式. Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config.Spring Cloud Netflix.Spring Cloud0 CloudFoundry.

Spring Cloud微服务架构—服务注册与发现

Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等操作提供了一种简单的开发方式. Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config.Spring Cloud Netflix.Spring Cloud0 CloudFoundry.

(一)整合spring cloud云服务架构 - Spring Cloud简介

Spring Cloud是一系列框架的有序集合.利用Spring Boot的开发模式简化了分布式系统基础设施的开发,如服务发现.注册.配置中心.消息总线.负载均衡.断路器.数据监控等(这里只简单的列了一部分),都可以用Spring Boot的开发风格做到一键启动和部署.Spring Cloud将目前比较成熟.经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装,屏蔽掉了复杂的配置和实现原理,最终整合出一套简单易懂.易部署和易维护的分布式系统架构平台. Spring Clou

在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用

本文为阿里云容器服务Spring Cloud应用开发系列文章的第一篇. 一.在阿里云容器服务上开发Spring Cloud微服务应用(本文) 二.部署Spring Cloud应用示例 三.服务发现 四.服务间通信与集成 五.服务智能路由 六.集中配置管理 七.高可用和容错 八.监控和日志 九.服务的部署和发布策略 微服务概述 单体应用通常指在一个程序中满足多个业务或技术领域的需求,不同的需求领域内化为模块.假定我们要开发一个Web应用,通常的MVC模式可以满足要求.针对不同领域有不少代码生成工具

(一)整合spring cloud云服务架构

Spring Cloud是一系列框架的有序集合.利用Spring Boot的开发模式简化了分布式系统基础设施的开发,都可以用Spring Boot的开发风格做到一键启动和部署.Spring Cloud将目前比较成熟.经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装,屏蔽掉了复杂的配置和实现原理,最终整合出一套简单易懂.易部署和易维护的分布式系统架构平台. Spring Cloud的子项目,大致可分成两类:一类是对现有成熟框架Spring Boot的封装和抽象,也是数量最

关于Spring Cloud微服务架构

微服务架构 Spring Cloud解决的第一个问题就是:服务与服务之间的解耦.很多公司在业务高速发展的时候,服务组件也会相应的不断增加.服务和服务之间有着复杂的相互调用关系,经常有服务A调用服务B,服务B调用服务C和服务D ...,随着服务化组件的不断增多,服务之间的调用关系成指数级别的增长,这样最容易导致的情况就是牵一发而动全身.经常出现由于某个服务更新而没有通知到其它服务,导致上线后惨案频发.这时候就应该进行服务治理,将服务之间的直接依赖转化为服务对服务中心的依赖.Spring Cloud