springcloud项目

项目实操

kpi考核项目技术设计:
链接:https://pan.baidu.com/s/1MSJ05PUk73XFwU-WTvxb9Q
提取码:f6tp

一、springcloud项目搭建
最终结构如图:
在这里插入图片描述
参考链接:https://www.cnblogs.com/zhainan-blog/p/11634621.html
总结:
1、建一个主项目
2、建一个module作为注册中心,需要勾选spring cloud discovery->eureka server。
3、在启动类增加注解:@EnableEurekaServer,修改配置文件。如下示例
5、建一个module作为客户端,需要勾选spring cloud discovery->eureka Discovery client、spring cloud Routing->OpenFeign、web ->spring Web。
6、在启动类增加注解:@EnableEurekaClient,修改配置文件。如下示例

#注册中心
server.port=8081
eureka.client.service-url.defaultZone=http://127.0.0.1:8081/eureka
#是否将自己注册到注册中心
eureka.client.register-with-eureka=false
#是否需要搜索服务信息
eureka.client.fetch-registry=false

#客户端
server.port=8082
spring.application.name=att-web-kpi

eureka.client.service-url.defaultZone=http://127.0.0.1:8081/eureka
#是否将自己注册到注册中心
eureka.client.register-with-eureka=true
#是否需要搜索服务信息
eureka.client.fetch-registry=true
# 使用ip地址注册到注册中心
eureka.instance.prefer-ip-address=true
# 注册中心列表中显示的状态参数
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}

补充:
Q:打包时报错:Please refer to D:\att\kpisystem\target\surefire-reports for the individual test results
A:pom文件中增加依赖插件,使单元测试不影响项目的编译

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <testFailureIgnore>true</testFailureIgnore>
                </configuration>
            </plugin>

五大组件

Eureka

• Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里

Eureka的治理机制

服务提供者

服务注册: 启动的时候会通过发送REST请求的方式将自己注册到Eureka Server上,同时带上了自身服务的一些元数据信息。
服务续约: 在注册完服务之后,服务提供者会维护一个心跳用来持续告诉Eureka Server: "我还活着 ”
服务下线: 当服务实例进行正常的关闭操作时,它会触发一个服务下线的REST请求给Eureka Server, 告诉服务注册中心:“我要下线了 ”。

服务消费者

获取服务: 当我们启动服务消费者的时候,它会发送一个REST请求给服务注册中心,来获取上面注册的服务清单。服务消费者在调用服务时,如果Eureka Client没有缓存注册表的话,会从Eureka Server获取最新的注册表。
服务调用: 服务消费者在获取服务清单后,通过服务名可以获得具体提供服务的实例名和该实例的元数据信息。在进行服务调用的时候,优先访问同处一个Zone中的服务提供方。

服务注册中心

失效剔除: 默认每隔一段时间(默认为60秒) 将当前清单中超时(默认为90秒)没有续约的服务剔除出去。
自我保护: EurekaServer 在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%(通常由于网络不稳定导致)。 Eureka Server会将当前的实例注册信息保护起来, 让这些实例不会过期,尽可能保护这些注册信息。

工作流程:

1、Eureka Server启动成功,等待服务端注册。

在启动过程中如果配置了集群,集群之间定时通过Replicate同步注册表,每个Eureka Server都存在独立完整的服务注册表信息。

2、Eureka Client启动时根据配置的Eureka Server地址去注册中心注册服务。

3、Eureka Client会每30秒向Eureka Server发送一次心跳,证明客户端服务正常。

4、当Eureka Server90秒内没有收到Eureka Client的心跳,注册中心则认为该节点失效,会注销该实例。

5、单位时间内Eureka Server统计到大量的Eureka Client没有发送心跳,则认为可能为网络异常,进入自我保护机制,不再剔除没有发送心跳的客户端。

6、当Eureka Client心跳恢复正常后,Eureka Server自动退出自我保护机制。

7、Eureka Client定时全量或者增量从注册中心获取服务注册表,并且将获取到的信息缓存在本地。

8、服务调用时,Eureka Client会先从本地缓存找寻调取的服务。如果获取不到,先从注册中心刷新注册表,再同步到本地缓存。

9、Eureka Client获取到目标服务器信息,发起服务调用。

10、Eureka Client程序关闭时向Eureka Server发送取消请求,Eureka Server将实例从注册表中剔除。

Config

• Config:分布式配置中心,分为服务端Server和客户端Client,server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client通过接口获取数据、并依据此数据初始化自己的应用。

配置实例

1.引入pom依赖

<dependencies>
   	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-config</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
	</dependency>
</dependencies>

2.服务端Server配置

#指定服务名称
spring.application.name=springcloud-hystrix-eureka-server

#指定服务端口
server.port=8005

#表示是否将自己注册到Eureka Server,默认是true
eureka.client.register-with-eureka=false

#表示是否从Eureka Server获取注册信息,默认为true。
eureka.client.fetch-registry=false

#设置与Eureka Server交互的地址,客户端的查询服务和注册服务都需要依赖这个地址。
eureka.client.serviceUrl.defaultZone=http://localhost:8005/eureka/

3.在服务端的SpringBoot启动类添加注解
@EnableEurekaServer:表示此服务是一个服务注册中心服务。
@EnableConfigServer:表示启用config配置中心功能

4.客户端Client配置

#配置文件的名称
spring.cloud.config.name=configtest

#配置的策略
spring.cloud.config.profile=pro

#开启配置信息发现
spring.cloud.config.discovery.enabled=true

#指定配置中心的service-id
spring.cloud.config.discovery.serviceId=springcloud-config-server

#设置与Eureka Server交互的地址,客户端的查询服务和注册服务都需要依赖这个地址。
eureka.client.serviceUrl.defaultZone=http://localhost:8005/eureka/

5.客户端注解:@EnableDiscoveryClient

Ribbon

• Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台

Ribbon的基本模块

ribbon-loadbalancer:负载均衡模块,可独立使用,也可以和别的模块一起使用。
Ribbon:内置的负载均衡算法都实现在其中。
ribbon-eureka:基于 Eureka 封装的模块,能够快速、方便地集成 Eureka。
ribbon-transport:基于 Netty 实现多协议的支持,比如 HTTP、Tcp、Udp 等。
ribbon-httpclient:基于 Apache HttpClient 封装的 REST 客户端,集成了负载均衡模块,可以直接在项目中使用来调用接口。
ribbon-example:Ribbon 使用代码示例,通过这些示例能够让你的学习事半功倍。
ribbon-core:一些比较核心且具有通用性的代码,客户端 API 的一些配置和其他 API 的定义。

使用实例

1.引入pom依赖

<dependency>
    <groupId>com.netflix.ribbon</groupId>
    <artifactId>ribbon</artifactId>
    <version>2.2.2</version>
</dependency>
<dependency>
    <groupId>com.netflix.ribbon</groupId>
    <artifactId>ribbon-core</artifactId>
    <version>2.2.2</version>
</dependency>
<dependency>
    <groupId>com.netflix.ribbon</groupId>
    <artifactId>ribbon-loadbalancer</artifactId>
    <version>2.2.2</version>
</dependency>
<dependency>
    <groupId>io.reactivex</groupId>
    <artifactId>rxjava</artifactId>
    <version>1.0.10</version>
</dependency>

2.客户端调用代码示例

// 服务列表
List<Server> serverList = Lists.newArrayList(new Server("localhost", 8081), new Server("localhost", 8083));
// 构建负载实例
ILoadBalancer loadBalancer = LoadBalancerBuilder.newBuilder().buildFixedServerListLoadBalancer(serverList);
// 调用 5 次来测试效果
for (int i = 0; i < 5; i++) {
    String result = LoadBalancerCommand.<String>builder().withLoadBalancer(loadBalancer).build()
            .submit(new ServerOperation<String>() {
                public Observable<String> call(Server server) {
                    try {
                        String addr = "http://" + server.getHost() + ":" + server.getPort() + "/user/hello";
                        System.out.println(" 调用地址:" + addr);
                        URL url = new URL(addr);
                        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                        conn.setRequestMethod("GET");
                        conn.connect();
                        InputStream in = conn.getInputStream();
                        byte[] data = new byte[in.available()];
                        in.read(data);
                        return Observable.just(new String(data));
                    } catch (Exception e) {
                        return Observable.error(e);
                    }
                }
            }).toBlocking().first();
    System.out.println(" 调用结果:" + result);
}

负载均衡的几种策略

1、随机策略——RandomRule
2、轮询策略——RoundRobinRule(ribbon默认为轮询)
3、重试策略——RetryRule:先按照RoundRobinRule(轮询)策略获取服务,如果获取服务失败则在指定时间内进行重试,获取可用的服务;
4、最低并发策略——BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
5、可用过滤策略——AvailabilityFilteringRule:会先过滤掉由于多次访问故障而处于断路器状态的服务,还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问;
6、响应时间加权策略——WeightedResponseTimeRule:根据平均响应时间计算所有服务的权重,响应时间越快的服务权重越大被选中的概率越大。刚启动时如果统计信息不足,则使用RoundRobinRule(轮询)策略,等统计信息足够,会切换到WeightedResponseTimeRule;
7、区域权衡策略——ZoneAvoidanceRule:复合判断Server所在区域的性能和Server的可用性选择服务器

配置方式可修改配置文件

service-B.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

Hystrix

• Hystrix:发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题

Hystrix主要作用:
1.第三方接口超时或失败时,保护服务。
2.防止系统链式雪崩。
3.快速失败与恢复,优雅降级。
4.提供近实时监控,报警。

断路器HystrixCircuitBreaker的三种状态:
CLOSED关闭状态:允许流量通过。
OPEN打开状态:不允许流量通过,即处于降级状态,走降级逻辑。
HALF_OPEN半开状态:允许某些流量通过,并关注这些流量的结果,如果出现超时、异常等情况,将进入OPEN状态,如果成功,那么将进入CLOSED状态。

在这里插入图片描述

整体流程:
1:每次调用创建一个新的HystrixCommand,把依赖调用封装在run()方法中。
2:执行execute()/queue做同步或异步调用。
3:判断熔断器(circuit-breaker)是否打开,如果打开,则进行降级策略,如果关闭则进入下一步.
4:判断线程池/队列/信号量是否跑满,如果跑满进入降级步骤,否则继续后续步骤。
5:调用HystrixCommand的run方法.运行依赖逻辑,若依赖逻辑调用超时,则降级。
6:判断逻辑是否调用成功,若失败则降级。
7:计算熔断器状态,所有的运行状态(成功, 失败, 拒绝,超时)上报给熔断器,用于统计从而判断熔断器状态。
8:getFallback()降级逻辑,以下四种情况将触发getFallback调用:
(1):run()方法抛出非HystrixBadRequestException异常。
(2):run()方法调用超时
(3):熔断器开启拦截调用
(4):线程池/队列/信号量是否跑满
9:返回结果

Zuul

• Zuul:如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务

zuul网关的作用

统一入口:为全部微服务提供一个唯一的入口,网关起到外部和内部隔离的作用,保障了后台服务的安全性。
鉴权校验:识别每个请求的权限,拒绝不符合要求的请求。
动态路由:动态的将请求路由到不同的后端集群中。
减少客户端与服务端的耦合:服务可以独立发展,通过网关层来做映射。

过滤器Filter类型

PRE: 这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。
POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
ERROR:在其他阶段发生错误时执行该过滤器。
除了默认的过滤器类型,还可以自定义过滤器类型

自定义过滤器实现方式:继承ZuulFilter类,重写4个方法
public class MyFilter extends ZuulFilter {
    @Override
    String filterType() {
        return "pre"; //定义filter的类型,有pre、route、post、error四种
    }

    @Override
    int filterOrder() {
        return 10; //定义filter的顺序,数字越小表示顺序越高,越先执行
    }

    @Override
    boolean shouldFilter() {
        return true; //表示是否需要执行该filter,true表示执行,false表示不执行
    }

    @Override
    Object run() {
        return null; //filter需要执行的具体操作
    }
}

启用禁用配置方式

zuul:
  PreRequestLogFilter: #自定义Filter类名
    pre: #Type
      disable: true
      

示例

1.在启动类添加注解,开启Zuul的网关功能

@EnableZuulProxy 

2.配置类配置端口

server:
  port: 10010 #服务端口
spring: 
  application:  
    name: api-gateway #指定服务名

3.编写路由规则

zuul:
  routes:
    service: # 这里是路由id,随意写
      path: /service/** # 这里是映射路径
      url: http://127.0.0.1:8081 # 映射路径对应的实际url地址

4.整合eureka,注册到注册中心

依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

启动类添加注解:
@EnableDiscoveryClient

添加Eureka配置:
eureka:
  client:
    registry-fetch-interval-seconds: 5 # 获取服务列表的周期:5s
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
  instance:
    prefer-ip-address: true
    ip-address: 127.0.0.1

5.修改映射配置,通过服务名称获取

zuul:
  routes:
    user-service: # 路由id
      path: /service/** # 映射路径
      service-id: service # 指定服务名称
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值