1.概念
Spring cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务的。
2.spring cloud入门环境搭建
1)搭建环境
以maven多模块化的方法搭建
2)注册中心
由于Spring Cloud为服务治理做了一层抽象接口,所以在Spring Cloud应用中可以支持多种不同的服务治理框架,比如:Netflix Eureka、Consul、Zookeeper。在Spring Cloud服务治理抽象层的作用下,我们可以无缝地切换服务治理实现,并且不影响任何其他的服务注册、服务发现、服务调用等逻辑。
3)服务提供者
4)服务消费者
--父类pom.xml限定springboot和cloud的版本
<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>
--注册中心eureka
1.导包
<!--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-server</artifactId>
</dependency>
2.配置yaml application.yml
server:
port: 7001
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false #是否要注册到eureka
fetchRegistry: false #表示是否从Eureka Server获取注册信息
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #单机配置
3.配置启动类
@SpringBootApplication//标识为springboot项目
@EnableEurekaServer//标识为eureka的服务端
public class EurekaApplicationn7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaApplicationn7001.class);
}
}
4.测试
--springcloud 服务提供者
导包
1.controller
@RestController
@RequestMapping("/provider")
public class UserController {
@RequestMapping("/user/{id}")
public User getuser(@PathVariable("id") Long id){
return new User(id,"ss");
}
}
2.yaml配置
server:
port: 8001
spring:
application:
name: USER-PROVIDER #不要使用下划线
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka #告诉服务提供者要把服务注册到哪儿,注册中心的地址
3.启动类
@SpringBootApplication
@EnableEurekaClient//标识为eqreka的客户端
public class UserProviderApplication8001 {
public static void main(String[] args) {
SpringApplication.run(UserProviderApplication8001.class);
}
}
--spring cloud入门消费者
导包
<dependencies>
<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>
//公共层 依赖
<dependency>
<groupId>com.xxxxx.springcloud</groupId>
<artifactId>interface-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
1.yaml
server:
port: 9001
2.入口函数
@SpringBootApplication
public class UserConsumerApplication9001 {
public static void main(String[] args) {
SpringApplication.run(UserConsumerApplication9001.class);
}
3.controller
--1.使用resttemplate传入服务地址,直接发起请求调用,与注册中心没有关系
@RestController
@RequestMapping("/consumer")
public class UserController {
@RequestMapping("/user/{id}")
public User getUserById(@PathVariable("id") Long id){
//通过resttemplate来获取服务地址
RestTemplate restTemplate = new RestTemplate();
//http://localhost:8001/provider/user/1
return restTemplate.getForObject("http://localhost:8001/provider/user/"+id, User.class);
}
}
--或者可以配置一个resttemplate,方便调用
//目的是把RestTemplate实例交给spring管理,就可以直接使用的时候依赖注入就ok了,不再去new对象
@Configuration
public class RestTemplateBean {
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
相当于springxml中配置bean
@RestController
@RequestMapping("/consumer")
public class UserController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/user/{id}")
public User getUserById(@PathVariable("id") Long id){
//通过resttemplate来获取服务地址
//1.直接new resttemplate对象
//RestTemplate restTemplate = new RestTemplate();
//2、可直接配置一个resttemplate,方便调用
//http://localhost:8001/provider/user/1
return restTemplate.getForObject("http://localhost:8001/provider/user/"+id, User.class);
}
}
--注册中心集群
如果只有一个注册中心服务器,会存在单点故障;可以配置多个注册中心服务器,相互依赖,且做同样的事情,保证一个服务器死机后,仍然可以访问
集群的两个项目功能都是一样的,为了保证高可用,应该部署在不同的服务器的上,所以我们应该至少有2个ip地址,这里,我们通过修改localhost文件,模拟2个不同的服务地址。
步骤:就是把这个eureka_server_7002拷贝一份
1:映射hosts 模拟域名解析 C:\Windows\System32\drivers\etc
127.0.0.1 eureka-7001.com
127.0.0.1 eureka-7002.com
--只需将注册中心7001代码复制一份端口号改成7002
--在yaml配置文件中修改地址信息,两个服务相互依赖即可
server:
port: 7002
eureka:
instance:
hostname: www.eureka-7002.com
client:
registerWithEureka: false #是否要注册到eureka
fetchRegistry: false #表示是否从Eureka Server获取注册信息
serviceUrl:
defaultZone: http://www.eureka-7001.com:7001/eureka/ #这里是另一个中心的地址
同理在7001的配置文件配置7002的地址;
这样就可以解决单点故障问题
--测试访问
--springcloud入门加强之消费者负载均衡
1.ribbon 负载均衡
Ribbon是Netflix发布的云中间层服务开源项目,主要功能是提供客户端(消费者方)负载均衡算法。Ribbon客户端组件提供一系列完善的配置项,如,连接超时,重试等。简单的说,Ribbon是一个客户端负载均衡器,我们可以在配置文件中列出load Balancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器,我们也很容易使用Ribbon实现自定义的负载均衡算法。
--单服务提供者操作
导包
<dependency>
<groupId>com.xxxxx.springcloud</groupId>
<artifactId>interface-common</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>
入口函数
@SpringBootApplication//标志为springboot项目
@EnableEurekaClient//标志为eureka的客户端--消费者需要在注册中心获取服务
public class UserApplication9002 {
public static void main(String[] args) {
SpringApplication.run(UserApplication9002.class );
}
}
--配置一个bean并开启负载均衡
//目的是把RestTemplate实例交给spring管理,就可以直接使用的时候依赖注入就ok了,不再去new对象
@Configuration
public class RestTemplateBean {
@Bean
@LoadBalanced//开启负载均衡
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
--yaml
server:
port: 9002
eureka:
client:
registerWithEureka: false #不注册到Eureka,不在注册中心显示
service-url:
#defaultZone: http://localhost:7001/eureka
defaultZone: http://www.eureka-7001.com:7001/eureka,http://www.eureka-7002.com:7002/eureka
--controller
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/user/{id}")
public User getUserById(@PathVariable("id") Long id){
return restTemplate.getForObject("http://USER-PROVIDER/provider/user/"+id, User.class);
}
}
--入口函数
@SpringBootApplication//标志为springboot项目
@EnableEurekaClient//标志为eureka的客户端--消费者需要在注册中心获取服务
public class UserApplication9002 {
public static void main(String[] args) {
SpringApplication.run(UserApplication9002.class );
}
}
-- 多服务提供者负载高级操作
1.导包
2.配置多个服务提供者
3.配置消费者riddon为负载均衡
@Configuration
public class RestTemplateBean {
@Bean
@LoadBalanced//开启负载均衡
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
测试结果
--负载均衡策略
内置负载均衡规则类 |
规则描述 |
RoundRobinRule(默认) |
简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。 |
AvailabilityFilteringRule |
对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 注意:可以通过修改配置loadbalancer.<clientName>.connectionFailureCountThreshold来修改连接失败多少次之后被设置为短路状态。默认是3次。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上线,可以由客户端的<clientName>.<clientConfigNameSpace>.ActiveConnectionsLimit属性进行配置。
|
WeightedResponseTimeRule |
为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。 |
ZoneAvoidanceRule |
以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。 |
BestAvailableRule |
忽略哪些短路的服务器,并选择并发数较低的服务器。 |
RandomRule |
随机选择一个可用的服务器。 |
Retry |
重试机制的选择逻辑 |
//目的是把RestTemplate实例交给spring管理,就可以直接使用的时候依赖注入就ok了,不再去new对象
@Configuration
public class RestTemplateBean {
@Bean
@LoadBalanced//开启负载均衡
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
// 负载均衡测试替换
@Bean
public IRule myRule(){
return new RandomRule();
}
}
直接自定义负载均衡策略,就可以替换默认的策略。。。。。
--feign
通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理
Feign是以接口方式进行调用,而不是通过RestTemplate来调用,feign底层还是ribbon,它进行了封装,让我们调用起来更加方便
1.导包
<!--feign的支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.定义接口
//调用服务名字
//要和服务提供者里面访问地址和参数等保持一致。
@FeignClient(value = "USER-PROVIDER")
@RequestMapping("/provider")
public interface UserCilent {
@RequestMapping("/user/{id}")//地址也必须是跟提供者的地址一致
User getuser(@PathVariable("id") Long id);//必须跟提供者方法签名一致
}
3.配置yaml
server:
port: 9003
eureka:
client:
registerWithEureka: false #不注册到Eureka,不在注册中心显示
service-url:
defaultZone: http://eureka-7001.com:7001/eureka,http://eureka-7002.com:7002/eureka
4.controller
@RestController
@RequestMapping("/consumer")
public class UserController {
@Autowired
private UserCilent userCilent;
@RequestMapping("/user/{id}")
public User getuser(@PathVariable("id") Long id){
return userCilent.getuser(id);
}
}
6.入口函数
@SpringBootApplication//标志为springboot项目
//@EnableEurekaClient//标志为eureka的客户端--消费者需要在注册中心获取服务
@EnableFeignClients(basePackages = "cn.dddddd.springcloud.service") //扫描本地feign的接口
public class UserApplication9003 {
public static void main(String[] args) {
SpringApplication.run(UserApplication9003.class );
}
}
测试效果不好展示,总结没毛病!
RoundRobinRule(默认) |
简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。 |