spring cloud 学习笔记一

时间:2020-12-21 12:13:34

1.概念

Spring cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务的。

2.spring cloud入门环境搭建

 

1)搭建环境

 

       maven多模块化的方法搭建

 

2)注册中心

 

由于Spring Cloud为服务治理做了一层抽象接口,所以在Spring Cloud应用中可以支持多种不同的服务治理框架,比如:Netflix EurekaConsulZookeeper。在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.测试

spring cloud 学习笔记一

--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);
}
}



--注册中心集群

如果只有一个注册中心服务器,会存在单点故障;可以配置多个注册中心服务器,相互依赖,且做同样的事情,保证一个服务器死机后,仍然可以访问

 

集群的两个项目功能都是一样的,为了保证高可用,应该部署在不同的服务器的上,所以我们应该至少有2ip地址,这里,我们通过修改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的地址;
这样就可以解决单点故障问题
--测试访问
spring cloud 学习笔记一


--springcloud入门加强之消费者负载均衡

1.ribbon 负载均衡

RibbonNetflix发布的云中间层服务开源项目,主要功能是提供客户端(消费者方)负载均衡算法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();
}
}
测试结果
spring cloud 学习笔记一spring cloud 学习笔记一
--负载均衡策略

内置负载均衡规则类

规则描述

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默认的负载均衡规则