4.SpringCloud 基本架构

1.SpringCloud概述

        Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式会话,集群状态。(用来管理项目)

2.注册中心Eureka

        Spring Cloud Eureka 是对Netflix公司的Eureka的二次封装,它实现了服务治理的功能,Spring Cloud Eureka提供服务端与客户端,服务端即是Eureka服务注册中心,客户端完成微服务向Eureka服务的注册与发现。服务端和客户端均采用Java语言编写。

        服务器将自己的信息(IP、端口号、服务类) 提供给注册中心,然后每个服务器将所有存在注册中心的注册信息保存一份在自己服务器中,从而实现服务器之间的交流

3. 分布式项目搭建

        在一个分布式项目中,通常会采用父项目和子项目的方式来进行模块化开发和管理。父项目用于管理整个项目的共享依赖和配置,而子项目则代表着项目的不同模块或子系统。

3.1 创建父项目

         可以删除父项目中的src,父项目不需要写代码

        在父项目pom.xml中指定打包方式为pom

<packaging>pom</packaging>

3.2 创建子项目

        子项目pom.xml中指定父项目

 <parent>
           <artifactId>springcloud-teach</artifactId>
           <groupId>com.luobei</groupId>
           <version>1.0</version>
</parent>

        父项目pom.xml中指定子项目 

<modules>
            <module>eureka-server</module>
</modules>

        配置yml配置文件

server:port: 8081
spring:application:name: goods   #微服务可以根据微服务的名字自动形成集群,微服务的名字中不要出现下划线
eureka:client:service-url:defaultZone: http://localhost:8761/eureka/    #向这个接口注册instance:instance-id: goods-8081     #指定当前微服务在注册中心中的id

        主启动类上开启 @EnableEurekaClient

@SpringBootApplication
@EnableEurekaClient
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}
}

3.2.1 创建注册中心

        注册中心其实就是一个特殊的子项目,除yml配置不同,其他与别的子项目一致

server:port: 8761
spring:application:name: eureka-server   #微服务可以根据微服务的名字自动形成集群,微服务的名字中不要出现下划线
eureka:instance:hostname: localhostclient:register-with-eureka: false   #是否将当前服务器注册到注册中心fetch-registry: false    #是否将注册列表的信息拉取到本地service-url:defaultZone: http://${eureka.instance.hostname}:${server.port}    #注册中心的接口,其他微服务器通过该接口进行注册

        主启动类上开启@EnableEurekaServer

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
}

4.微服务调接口

        在微服务架构中,服务之间的通信是通过调用接口来实现的。这些接口可以是 RESTful API、gRPC、消息队列等方式实现的。

4.1 RestTemplate(仅了解)

        属于SpringBoot

        缺点:put、delete请求得不到返回的结果,使用、维护不方便

4.2 openfeign

        OpenFeign 是一个基于 Java 的声明式 HTTP 客户端,通常用于微服务架构中不同服务之间的接口调用。它允许开发者通过注解的方式定义接口,然后由 OpenFeign 自动生成具体的实现。这样可以简化服务之间的通信,让接口调用看起来更像是本地方法调用。

4.2.1 openfeign使用

4.2.1.1 导入依赖

        父项目:

  <dependencyManagement><dependencies><!--openfeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-openfeign-core</artifactId><version>2.2.6.RELEASE</version></dependency></dependencies></dependencyManagement>

        公共模块:

<!--openfeign-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.6.RELEASE</version>
</dependency>

        子项目:

<!--openfeign-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-openfeign-core</artifactId>
</dependency>

4.2.1.2 编写接口

        若接口将会被多个微服务调用则写在commons中

@FeignClient(name="GOODS",path="/goods")
public interface FeignGoodsService {@PutMapping("/updateStock")ResponseResult<List<Goods>> del(@RequestBody List<OrderGoodsVo> orderGoodsVoList);
}

        @FeignClient(name = "GOODS",path = "/goods") 中name为被调用微服务的名字,path为路径前缀,将要调用的接口方法的声明、请求方式全部拷贝过来

4.2.1.3 使用接口

        在需要使用接口的微服务的主启动类上扫描feign接口

@EnableFeignClients(basePackages = "com.luobei.commons.service")

        然后在需要使用的地方注入就行了

@Resource
private FeignGoodsService feignGoodsService;
@Override
public OrderVo add(Integer uid, AddOrderVo orderVo) throws OutOffStockException {ResponseResult<List<Goods>> del = feignGoodsService.del(Arrays.asList(orderGoodsVo));return del;
}

4.2.2 openfeign通信日志

        openfeign提供了日志打印功能,通过配置日志级别,对接口的调用情况进行监控和输出

日志级别解释
NONE默认的,不显示任何日志
BASIC仅记录请求方法、URL、响应状态码及执行时间
HEADERS除了 BASIC 中定义的信息之外,还有请求和响应的头信息
FULL除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据

        在调用别的服务器的服务器配置配置类

import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class LogConfiguration {@Beanpublic Logger.Level level(){return Logger.Level.FULL;}
}

         因为feign日志的输出级别都是debug级别,还需要设置service包的日志级别

logging:
  level:
    com.commons.service: debug

5. Ribbon负载均衡

        Ribbon是一个基于HTTP和TCP客户端的负载均衡器,默认使用轮询的方式

        SpringCloud Ribbon是基于Netfix Ribbon实现的一套客户端负载均衡工具

5.1 Ribbon配置

5.1.1 全局配置

        在需要调取多个服务器的服务器中配置配置类

@Configuration
public class RibbonConfiguration {

    @Bean
    public IRule rule(){
        return new RandomRule();
    }
}

5.1.2 局部配置

        注意:全局与局部同时存在时,ribbon优先使用全局配置

GOODS:   #微服务名字
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule

5.2 Ribbon超时管理

        Ribbon默认请求超时时间为1000毫秒,有的时候不够用,因此需要重新配置

ribbon:
  http:
    client:
      enabled: true   #开启超时管理
  ReadTimeout: 10000  #请求超时
  ConnectTimeout: 10000 #连接超时

6.网关(Gataway)

        网关是在分布式系统架构中的一种设计模式,用于集中处理和管理请求;微服务架构中常用网关技术有:Zuul、Spring Cloud Gataway等

6.1 网关的作用

        1.路由和负载均衡:网关可以根据请求的路径或其他条件将请求路由到不同的后端微服务

        2.鉴权和认证:网关可以进行用户身份验证、授权以及访问权限的校验

        3.监控和日志:网关可以记录请求和响应的日志,从而监控系统的运行状况、性能和问题

6.2 Zuul

        Zuul 是 Netflix 开源的一个微服务架构中的边缘服务(Edge Service),主要用于实现动态路由、负载均衡、鉴权、监控等功能。(性能不如Gataway)

6.2.1 zuul使用

6.2.1.1 创建zuul微服务

        连接父项目。。

        导入zuul依赖

<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

6.2.1.2 配置eureka、路由

server:port: 8500
spring:application:name: zuul   #微服务名字,很重要,微服务可以根据微服务的名字自动形成集群,微服务的名字中不要出现下划线
eureka:client:service-url:defaultZone: http://localhost:8761/eureka/    #向这个接口注册instance:instance-id: zuul-8500     #指定当前微服务在注册中心中的id
zuul:routes:goods:                 #路由名,用户自定义service-id: GOODS    #调用的微服务名path: /goods/**      #匹配的路径order:service-id: ORDERpath: /order/**
#    GOODS: /goods/**
#    ORDER: /order/**

        注意:路由有两种配置方式,都可

6.2.1.3 zuul主启动类添加注解

@SpringBootApplication
@EnableEurekaClient    //注册
@EnableZuulProxy        //开启路由功能
@EnableHystrix             //解决504报错问题
public class ZuulApplication {public static void main(String[] args) {SpringApplication.run(ZuulApplication.class, args);}
}

注意:使用zuul时请求地址应多一个请求的微服务名(http://localhost:8500/goods/goods/all)

 6.2.2 zuul过滤器实现网关限流

zuul过滤器
PRE请求到达zuul之前执行,可以用来鉴权、判断登录、限流
ROUTING

路由时(将请求转发给对应的微服务)执行

POST路由完毕时(微服务返回结果)执行
ERROR在pre、routing、post出现异常时执行

        自定义过滤器使用令牌桶算法实现网关限流

@Slf4j
@Component
public class LimitFilter extends ZuulFilter {//创建令牌桶,并设置令牌个数private static final RateLimiter RATE_LIMITER = RateLimiter.create(1);//指定当前过滤器类型@Overridepublic String filterType() {return "pre";}//执行顺序,可以为负数,数字越小越先执行@Overridepublic int filterOrder() {return Integer.MIN_VALUE;}//是否要对当前请求进行过滤@Overridepublic boolean shouldFilter() {//得到请求的uri,判断是否需要登录,如果不需要返回false(放行),否则返回true(执行run()方法)//得到上下文对象RequestContext context = RequestContext.getCurrentContext();HttpServletRequest request = context.getRequest();log.info(request.getRequestURI());return true;}//执行过滤业务的代码:例如校验refreshtoken、token@Overridepublic Object run() throws ZuulException {//获取令牌if(!RATE_LIMITER.tryAcquire()){//令牌用完,至少有100个请求正在处理log.info("令牌不足");//结束本次请求RequestContext context = RequestContext.getCurrentContext();context.setSendZuulResponse(false);HttpServletResponse response = context.getResponse();try {response.setContentType("text/html;charset=utf-8");response.getWriter().write("系统正忙");} catch (IOException e) {throw new RuntimeException(e);}}return null;}
}

6.2.2.1 漏桶算法

        简单来说,把我们的分布式系统理解成一个上方注水下方漏水的桶,固定下方漏水的速率,这样就能限制请求的速度,当水超过桶流量则丢弃

6.2.2.2 令牌桶算法

        每个请求向从桶里获取一个令牌,若令牌没有了则拒绝或等待请求处理完成的返回令牌;

6.3 Gataway

        SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty,因此Gataway的性能比较高效

        注意:gataway基于webflux,因此与spring web 不兼容

6.3.1 使用Gataway

        创建Gataway子项目,连接父项目

        主启动类开启@EnableEurekaClient

6.3.1.1 配置配置类

server:port: 8600
spring:application:name: gataway   #微服务名字,很重要,微服务可以根据微服务的名字自动形成集群,微服务的名字中不要出现下划线cloud:gateway:routes:- id: goods             #路由名(任意)uri: lb://GOODS       #要调用的微服务   lb:负载均衡predicates:           #匹配的路径- Path=/goods/**- id: orderuri: lb://ORDER       #要调用的微服务   lb:负载均衡predicates:           #匹配的路径- Path=/order/**
eureka:client:service-url:defaultZone: http://localhost:8761/eureka/    #向这个接口注册instance:instance-id: gataway-8600     #指定当前微服务在注册中心中的id

6.3.1.2 配置过滤器

@Component
@Slf4j
public class AuthFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("gateway过滤器");//获取uriServerHttpRequest request = exchange.getRequest();String path = request.getURI().getPath();log.info(path.toString());if(requireLogin(path)){//需要登录List<String> authorization = request.getHeaders().get("authorization");if(authorization!=null){String token = authorization.get(0);log.info(token);return chain.filter(exchange);}else{//没登陆ServerHttpResponse response = exchange.getResponse();ResponseResult<Boolean> responseResult = new ResponseResult<>(ResponseResult.NO_LOGIN,"请登录",false);try {//转换成json字符串String json = new ObjectMapper().writeValueAsString(responseResult);//转byte数组byte[] data = json.getBytes(StandardCharsets.UTF_8);//将数组封装到bufferDataBuffer buffer = response.bufferFactory().wrap(data);//设置响应头response.getHeaders().add("Content-Type","application/json;charset=utf-8");//返回数据,并终止return response.writeWith(Mono.just(buffer));} catch (JsonProcessingException e) {e.printStackTrace();}}}//放行return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}private boolean requireLogin(String uri){//将不需要登录就能操作的uri罗列出来String[] uris = {"/user/login","/user/register","/kill/info","/nginx/port"};String[] staticResource = {"/goods/info/","/goods/find/","/images/"};for (String s : uris) {if(uri.equals(s) ){return false;}}for (String s : staticResource) {if(uri.startsWith(s)){return false;}}return true;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/100844.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

测试框架pytest教程(2)-用例依赖库-pytest-dependency

对于 pytest 的用例依赖管理&#xff0c;可以使用 pytest-dependency 插件。该插件提供了更多的依赖管理功能&#xff0c;使你能够更灵活地定义和控制测试用例之间的依赖关系。 Using pytest-dependency — pytest-dependency 0.5.1 documentation 安装 pytest-dependency 插…

【源码篇】ThreadLocal源码解析(主打的就是通俗易懂,言简意赅)

文章目录 ThreadLocal学习笔记前言1、TheadLocal基本介绍2、ThreadLocal基本使用3、体验ThreadLocal的优点3.1 ThreadLocal与synchronized的比较3.2、ThreadLoca的应用场景 4、ThreadLocal的内部原理4.1 ThreadLocal内部结构4.2 ThreadLocal常用方法分析4.2.1 set原理分析4.2.2…

云计算在IT领域的发展和应用

文章目录 云计算的发展历程云计算的核心概念云计算在IT领域的应用1. 基础设施即服务&#xff08;IaaS&#xff09;&#xff1a;2. 平台即服务&#xff08;PaaS&#xff09;&#xff1a;3. 软件即服务&#xff08;SaaS&#xff09;&#xff1a; 云计算的拓展应用结论 &#x1f3…

学习maven工具

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f3e8;maven工具产生的背景&#x1f993;maven简介&#x1fa80;pom.xml文件(project object Model 项目对象模型) &#x1fa82;maven工具安装步骤两个前提&#xff1a;下载 m…

合宙Air724UG LuatOS-Air LVGL API--简介

为何是 LVGL LVGL 是一个开源的图形库&#xff0c;它提供了创建嵌入式 GUI 所需的一切&#xff0c;具有易于使用的图形元素、漂亮的视觉效果和低内存占用的特点。 LVGL特点&#xff1a; 强大的 控件 &#xff1a;按钮、图表、列表、滑动条、图像等 高级图形引擎&#xff1a;动…

[Docker] Portainer + nginx + AList 打造Docker操作三板斧

Portainer : Docker容器图形化管理系统 nginx: 反向代理利器 AList: 文件管理系统 目的: 依托Portainer 的图形管理界面,可视化的配置docker容器. AList再关联Docker各容器内部的配置文件,可视化配置,再配合Portainer重启,日志查看,命令行操作等.对于中小企业对容器化操作简…

ECharts配合Node.js爬虫实现数据可视化

数据可视化简介 可视化技术是将数据和信息以图形化的方式展示出来&#xff0c;以便更好地理解和分析。可视化技术通常使用各种图表、图形、动画和交互式效果来呈现数据。可视化技术有以下几个基本概念&#xff1a; 数据&#xff1a;可视化技术的基础是数据。数据可以是数字、文…

探索软件项目管理的本质及概念

什么是软件项目管理&#xff1f; 软件项目管理是指对软件项目从规划、组织、指挥、控制到最终交付的全过程进行有效管理的一种方法。它通过合理的资源分配、有效的沟通和高效的协作&#xff0c;确保软件项目能够按照预定的目标、时间和质量要求完成。在现代信息技术逐渐普及和…

rabbitmq的发布确认

生产者将信道设置成 confirm 模式&#xff0c;一旦信道进入 confirm 模式&#xff0c; 所有在该信道上面发布的 消息都将会被指派一个唯一的 ID (从 1 开始)&#xff0c;一旦消息被投递到所有匹配的队列之后&#xff0c;broker 就会发送一个确认给生产者(包含消息的唯一 ID)&…

科技云报道:云计算下半场,公有云市场生变,私有云风景独好

科技云报道原创。 大数据、云计算、人工智能&#xff0c;组成了恢弘的万亿级科技市场。这三个领域&#xff0c;无论远观近观&#xff0c;都如此性感和魅力&#xff0c;让一代又一代创业者为之杀伐攻略。 然而高手过招往往一瞬之间便已胜负知晓&#xff0c;云计算市场的巨幕甫…

QTreeWidget——信号处理

文章目录 基本属性信号一、信号种类二、信号测试1、currentItemChanged、itemCollapsed、itemExpanded三个信号的测试2、itemActivated信号3、 itemChanged信号4、其余信号的测试代码&#xff08;包含以上代码&#xff09; 基本属性 信号 一、信号种类 //当前项发生变化时触…

sdk manager (ubuntu20.4) 安装

1、首先下载sdk manager 1.9.3 下载链接 https://www.baidu.com/link?urlVXJhUqxxhS3eFK3bOPTzi5LFl6ybeW3JwDY1CwANaPf1gvO3IxQKzY547NIe53x1blJxnAXg7FTRTvs-cnfnVa&wd&eqida22baa7b0004ca980000000664e2d426 当然要登录自己的账号才能成功下载&#xff0c;下载对应…

解决Spring mvc + JDK17@Resource无法使用的情况

问题描述 我在使用jdk17进行Spring mvc开发时发现 Resource用不了了。 原因 因为JDK版本升级的改动&#xff0c;在Jdk9~17环境下&#xff0c;搭建Springboot项目&#xff0c;会出现原有Resource&#xff08;javax.annotation.Resource&#xff09;不存在的问题&#xff0c;导…

安卓主板定制_电磁屏/电容屏安卓平板基于MTK联发科方案定制

定制化行业平板 在各行各业中的地位越来越重要&#xff0c;甚至在行业转型和发展中发挥着不可替代的作用。随着工业化社会的快速发展&#xff0c;工业生产对智控设备要求越来越高&#xff0c;运用的范畴也越来越普遍广泛&#xff0c;工业级平板就是其中一种应用广泛的设备。 新…

数据结构—树表的查找

7.3树表的查找 ​ 当表插入、删除操作频繁时&#xff0c;为维护表的有序表&#xff0c;需要移动表中很多记录。 ​ 改用动态查找表——几种特殊的树 ​ 表结构在查找过程中动态生成 ​ 对于给定值key ​ 若表中存在&#xff0c;则成功返回&#xff1b; ​ 否则&#xff0…

python 画二部图

1. 特色二部图 修改节点与边颜色、大小等 import networkx as nx import matplotlib.pyplot as plt plt.figure(设备-用户关系图, figsize(4, 6)) # 设置画布大小list_fid [1, 2, 3, 4] # 添加设备节点 list_uid ["a", "b", "c"] # 添加用…

live555server环境搭建

live555环境搭建详解&#xff08;ubuntu18.04&#xff09; 1.环境依赖 openssl可选安不安 安装&#xff08;选择好版本&#xff09; sudo apt-get update sudo apt-get install openssl sudo apt-get install libssl-dev使用头文件是否可用时编译测试时记得链接&#xff08…

Python功能制作之简单的3D特效

需要导入的库&#xff1a; pygame: 这是一个游戏开发库&#xff0c;用于创建多媒体应用程序&#xff0c;提供了处理图形、声音和输入的功能。 from pygame.locals import *: 导入pygame库中的常量和函数&#xff0c;用于处理事件和输入。 OpenGL.GL: 这是OpenGL的Python绑定…

通过树莓派上搭建WordPress博客网站,并内外通透远程访问【无公网IP内网穿透】

虎头金猫主页 在强者的眼中&#xff0c;没有最好&#xff0c;只有更好。我们是移动开发领域的优质创作者&#xff0c;同时也是阿里云专家博主。 ✨ 关注我们的主页&#xff0c;探索iOS开发的无限可能&#xff01; &#x1f525;我们与您分享最新的技术洞察和实战经验&#xff…

GPT-4一纸重洗:从97.6%降至2.4%的巨大挑战

斯坦福大学和加州大学伯克利分校合作进行的一项 “How Is ChatGPTs Behavior Changing Over Time?” 研究表明&#xff0c;随着时间的推移&#xff0c;GPT-4 的响应能力非但没有提高&#xff0c;反而随着语言模型的进一步更新而变得更糟糕。 研究小组评估了 2023 年 3 月和 20…