SpringCloud微服务架构

文章目录
    • 认识微服务:
    • SpringCloud
      • 服务拆分及远程调用
      • 实现夸远程服务调用使用RestTemplate
      • Eureka注册中心
        • 搭建EruekaServer
        • 注册服务
        • 服务发现
      • Ribbon负载均衡
        • 修改负载均衡规则
        • 解饿加载
      • Nacos注册中心(nacos一部分功能)
        • 服务注册到nacos
        • nacos服务分级存储模型
        • 环境隔离 -namespace
      • Nacos配置管理
      • http客户端Feign
        • 自定义Feign的配置
        • Feign的性能优化
      • 统一网关Gateway
        • 网关功能:
        • 搭建网关服务:
        • 路由断言工厂Route Predicate Factory
        • 过滤器工厂
          • 请求头过滤器
          • 默认过滤器
          • 自定义全局过滤器
          • 过滤器执行顺序
          • 解决跨域问题

认识微服务:

单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。

优点:

  • 部署简单

  • 部署成本低

    缺点:

  • 耦合度高

  • 扩展性差

分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务。

优点:

  • 降低服务耦合度

  • 有利于服务升级扩展

    缺点:

  • 架构复杂

  • 难度大

微服务: 微服务是一种经过良好架构设计的分布式架构方案,微服务架构特征:

  • 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,能做到单一职责,避免重复业务开发
  • 面向服务:微服务对外暴露业务接口
  • 自治:团队独立、技术独立、数据独立、部署独立
  • 隔离性强:服务调用做好隔离、容错、降级、避免出现级联问题

优点: 拆分粒度更小、服务更独立、耦合度更低

缺点: 架构非常复杂,运维、监控、部署难度提高

(Dubbo、SpringCloud、SpringCloudAlibaba)微服务技术对比:

在这里插入图片描述

企业需求:

在这里插入图片描述

SpringCloud

SpringCloud是目前国内使用最广泛的微服务架构框架。它集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配。

官网地址:Spring Cloud
在这里插入图片描述

服务拆分及远程调用

服务拆分注意事项:

  1. 不同微服务,不要开发相同业务
  2. 微服务数据独立,不要访问其他微服务的数据库
  3. 微服务可以将自己的业务暴露为接口,提供给其他服务调用
实现夸远程服务调用使用RestTemplate

通过@Bean注解将RestTemplate对象交给spring管理,在需要的地方注入RestTemplate对象

调用方法:

		//利用RestTemplate发送http请求//url路径String url = "http://localhost:8081/user/"+ order.getUserId();//发送http请求,实现远程调用User user = restTemplate.getForObject(url, User.class);
Eureka注册中心

服务调用出现的问题 : 1.调用服务地址硬编码 2.多个服务如何选择 3.怎么知道服务提供者是否是健康状态

Eureka的作用:

在这里插入图片描述

  • 消费者如何向服务提供者提供具体信息的

    • 服务启动时向eureka注册自己的信息
    • eureka保存信息
    • 消费者根据服务名称向eureka拉取提供者信息
  • 如果多个提供者,消费者该如何选择

    • 消费者利用负载均衡算法,从服务列表中挑选一个
  • 消费者如何感知服务器提供者的健康状态

    • 服务提供者每隔30秒向EruekaServer发送请求,报告健康状态
    • eureka会更新服务器列表,不正常得到提供者会被剔除
搭建EruekaServer

1.创建项目引入依赖

<!--        eureak服务端--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>

2.编写启动类,添加@EnableEurekaServer注解

3.添加application.yml文件

server:port: 10086 #服务端口
spring:application:name: eurekaserver
eureka:client:service-url:  #eureka的地址信息deafultZone: http://127.0.0.1:10086/eureka

启动项目后方法10086端口就可以到eureka的界面

注册服务

将服务注册到eureka的步骤:

1.在服务项目中引入spring-cloud-starter-netflix-eureka-client的依赖

<!--        eureka客户端依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>

2.在application.yml文件,编写配置

server:port: 8081
spring:datasource:url: jdbc:mysql://localhost:3306/cloud_user?useSSL=falseusername: rootpassword: ******driver-class-name: com.mysql.jdbc.Driverapplication:name: userService #user服务名称
mybatis:type-aliases-package: cn.itcast.user.pojoconfiguration:map-underscore-to-camel-case: true
logging:level:cn.itcast: debugpattern:dateformat: MM-dd HH:mm:ss:SSS
eureka:client:service-url:  #eureka的地址信息defaultZone: http://127.0.0.1:10086/eureka
服务发现

1.在请求路径上面把路径换成我们注册服务的名称

 public Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);//利用RestTemplate发送http请求//url路径(将路径换成需要的服务的名称)String url = "http://userservice/user/"+ order.getUserId();//发送http请求,实现远程调用User user = restTemplate.getForObject(url, User.class);order.setUser(user);// 4.返回return order;}

2.加上RestTemplate的Bean上面加 @LoadBalanced 注解

Ribbon负载均衡

在这里插入图片描述

ribbon的负载均衡策略

在这里插入图片描述

在这里插入图片描述

修改负载均衡规则

默认是轮询方式

1.代码方式:在消费端的Application中,定义一个新的IRule

@Bean
public IRule randomRule(){return new RandowRule();
}

2.配置文件方式:配置文件只是更改一个服务的负载,不是全局

userservice:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
解饿加载

Ribbon默认是采用懒加载,即第一次加载时才会去创建LoadBalanceClient,请求时间会很长。而解饿加载则会在项目启动时创建,降低第一次访问的耗时。

ribbon:eager-load:enabled: true #开启解饿加载clients: -userservice #指定服务名称,多个服务需要在下面加 -
Nacos注册中心(nacos一部分功能)

Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富。

Windows启动nacos命令:startup.cmd -m standalone

服务注册到nacos

1.在Cloud-demo父工程中添加Spring-cloud-alilbaba 的管理依赖:

    <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.5.RELEASE</version><type>pom</type><scope>import</scope></dependency>

2.添加nacos的客户端依赖

<!--        nacos客户端依赖包--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>

3.改写application.yml 文件,向yml文件中加入nacos的服务地址配置

  application:name: userservice #user服务名称cloud:nacos:discovery:server-addr: localhost:8848 #nacos服务地址
nacos服务分级存储模型

添加服务集群属性

修改application.yml

  cloud:nacos:discovery:server-addr: localhost:8848 #nacos服务地址cluster-name: SH #集群名称,Hz代指杭州

更改服务访问规则(NacosRule负载均衡规则)

userservice:ribbon:NFLoadBalancerRuleClassName: com.alibaba.nacos.ribbon.NacosRule

NacosRule负载均衡规则 : 集群优先

环境隔离 -namespace

1.在nacos网站去创建namespace命名空间

在这里插入图片描述

2.配置服务所在命名空间,在application.yml文件中修改

  cloud:nacos:discovery:server-addr: localhost:8848cluster-name: HZnamespace: 359d6479-2271-43fa-9ca3-9cf1f1082906 #dev环境(复制我们创建好的命名空间Id)

不同nameSpace下的服务不可见(不能访问)

在这里插入图片描述

Nacos和eureka的区别

在这里插入图片描述

Nacos配置管理

配置更改热更新

在这里插入图片描述

统一配置管理

1.引入Nacos的配置管理客户端依赖:

<!--        nacos的配置管理依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>

2.在服务提供者中的resource目录中添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml文件

spring:application:name: userservice #服务名称profiles:active: dev #环境cloud:nacos:discovery:server-addr: localhost:8848 #nacos地址config:file-extension: yaml #文件后缀名

将application.yml文件中重复的配置删掉

在这里插入图片描述

配置自动刷新

  • 方式一:在@Value注入的变量所在类上添加注解@RefreshScope

  • 方式二:使用@ConfigurationProperties注解

    @Data
    @Component
    @ConfigurationProperties(prefix = “pattern”)
    public class PatternProperties {
    private String dateformat;
    }

多环境配置共享优先级:

服务名-profile.yaml > 服务名.yaml > 本地配置

热更新的Springboot实现

1.导入jar包

        <dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-config-spring-boot-starter</artifactId><version>0.2.11</version></dependency>

2.更改application.yaml文件

nacos:config:data-id: jc-club-oss  #用于指定要获取的配置数据的ID或名称。secret-key: nacos     # 用于进行访问控制的密钥,用于对配置中心的访问进行认证和授权。access-key: nacos   # 用于进行访问控制的密钥,用于对配置中心的访问进行认证和授权。group: DEFAULT_GROUP  #用于指定配置数据所属的分组,这样可以更好地组织和管理配置。type: yaml        #指定配置数据的类型,例如 YAML、Properties 等。server-addr: http://117.72.14.166:8848/  #指定Nacos配置中心的地址,包括主机名和端口。auto-refresh: true    #标识是否自动刷新配置内容,当配置中心的配置发生变化时,客户端是否自动更新配置。remote-first: true    #当配置中心不可用时,是否优先使用本地缓存的配置。bootstrap:enable: true    #是否启用Bootstrap配置,Bootstrap配置是在Spring应用程序启动时首先加载的一组配置。

3.使用@NacosValue注解

    @NacosValue(value = "${storage.service.type}",autoRefreshed = true)private String storageType;@GetMapping("/testNacos")public String testNacos() {return storageType;}

出现 failed to req API:/nacos/v1/ns/instance after all servers([localhost:8848]) tried: java.net.ConnectException: Connection refused: connect 异常

因为同时导入了Nacos的配置中心和注册中心的依赖导致

Nacos配置中心依赖 -config 注册中心 -discovery

http客户端Feign

使用之前的RestTemplate方式调用会出现一些问题

  • 代码可读性差,编程体验不统一
  • 参数复杂URL难以维护

Feign是一声明式的http客户端,作用是帮助我们优雅的实现http请求的发送。

1.引入Feign依赖

<!-- feign客户端依赖-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.7.RELEASE</version>
</dependency>

2.在启动类上添加注解开启Feign的功能

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients

3.编写Feign客户端

@FeignClient("userservice")
public interface UserClient {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);
}

注意:若出现 Load balancer does not have available server for client: userservice 错误 需要查看服务的命名空间是否一致

微服务之间用openfeign调用要想保证微服务之间的用户上下信息一致需要添加feign的拦截器

@Component
public class FeignRequestInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate requestTemplate) {ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = requestAttributes.getRequest();if (!ObjectUtils.isEmpty(request)) {String loginId = request.getHeader("loginId");if (StringUtils.isNotBlank(loginId)){requestTemplate.header("loginId",loginId);}}}
}

同时将FeignRequestInterceptor注册成Bean交给Spring管理

@Configuration
public class FeignConfiguration {@Beanpublic RequestInterceptor requestInterceptor(){return new FeignRequestInterceptor();}
}

这样其他微服务就可以通过拦截器拿到loginId

自定义Feign的配置

在这里插入图片描述

配置日志级别方式一(修改配置文件的方式):

feign:client:config:default:# 设置日志记录级别,其取值共有none、basic、headers、fullloggerLevel: FULL

配置日志级别方式二(声明Bean的方式):

public class DefaultFeignConfiguration {@Beanpublic Logger.Level logLevel(){return Logger.Level.BASIC;}
}

全局有效

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)

具体服务有效

@FeignClient(value = "userservice",configuration = DefaultFeignConfiguration.class)
Feign的性能优化

在这里插入图片描述

使用连接池代替默认的URLConnection:

Feign添加HttpClient的支持依赖:

<!--        引入HttpClient依赖--><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId></dependency>

配置application.yml文件:

feign:httpclient:enabled: true  #支持httpClient的开关max-connections: 200  #最大连接数max-connections-per-route: 50  #单个路径的最大连接数

Feign的优化:

  • 日志级别尽量用basic
  • 使用HttpClient或者OkHttp代替URLConnection

Feign的最佳实践
在这里插入图片描述

方式二:

  1. 新建module并引入feign的starter的依赖

            <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
    
  2. 将feign的客户端和实体类抽取到新建的module中

  3. 在需要使用服务的pom文件中引入依赖

  4. 修改组件有关的import部分,改成使用新建module中的包

在这里插入图片描述

统一网关Gateway
网关功能:
  • 身份认证和权限校验
  • 服务路由,负载均衡
  • 请求限流

Springcloud 中网关的实现包括两种:

  • gateway
  • zuul
搭建网关服务:

1.创建一个module,引入SpringCloudGateway的依赖和Nacos的服务发现依赖:

<!--        nacos服务发现依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
<!--        网关gateway依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>

2.编写路由配置以及Nacos地址

server:port: 10010 #网关端口
spring:application:name: gateway #服务名称cloud:nacos:server-addr: localhost:8848gateway:routes: #网关路由配置- id: user-service #路由Id,自定义,只要唯一即可#uri: http://127.0.0.1:8081 #路由的目标地址http是固定地址uri: lb://userservice #路由目标地址 lb就是负载均衡,后面跟服务名称predicates: #路由断言,也就是判断请求是否符合路由规则的条件- Path=/user/** #按照路径匹配,只要以/user/开头就符合条件- id: order-serviceuri: lb://orderservicepredicates: - Path=/order/** 

在这里插入图片描述

总结:

网关搭建步骤:

  1. 创建项目,引入nacos服务发现和gateway依赖

  2. 配置application.yml,包括服务基本信息、nacos地址、路由

路由配置包括:

  1. 路由id:路由的唯一标示

  2. 路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡

  3. 路由断言(predicates):判断路由的规则,

  4. 路由过滤器(filters):对请求或响应做处理

路由断言工厂Route Predicate Factory

我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件

例如Path=/user/**是按照路径匹配,这个规则是由

org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来

处理的,像这样的断言工厂在SpringCloudGateway还有十几个:

名称

说明

示例

After

是某个时间点后的请求

- After=2037-01-20T17:42:47.789-07:00[America/Denver]

Before

是某个时间点之前的请求

- Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]

Between

是某两个时间点之前的请求

- Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver]

Cookie

请求必须包含某些cookie

- Cookie=chocolate, ch.p

Header

请求必须包含某些header

- Header=X-Request-Id, d+

Host

请求必须是访问某个host(域名)

- Host=.somehost.org,.anotherhost.org

Method

请求方式必须是指定方式

- Method=GET,POST

Path

请求路径必须符合指定规则

- Path=/red/{segment},/blue/**

Query

请求参数必须包含指定参数

- Query=name, Jack或者- Query=name

RemoteAddr

请求者的ip必须是指定范围

- RemoteAddr=192.168.1.1/24

Weight

权重处理

过滤器工厂

GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:

在这里插入图片描述

名称

说明

AddRequestHeader

给当前请求添加一个请求头

RemoveRequestHeader

移除请求中的一个请求头

AddResponseHeader

给响应结果中添加一个响应头

RemoveResponseHeader

从响应结果中移除有一个响应头

RequestRateLimiter

限制请求的流量

请求头过滤器

下面我们以AddRequestHeader 为例来讲解。

需求:给所有进入userservice的请求添加一个请求头:Truth=itcast is freaking awesome!

只需要修改gateway服务的application.yml文件,添加路由过滤即可:

spring:cloud:gateway:routes:- id: user-service uri: lb://userservice predicates: - Path=/user/** filters: # 过滤器- AddRequestHeader=Truth, Itcast is freaking awesome! # 添加请求头

当前过滤器写在userservice路由下,因此仅仅对访问userservice的请求有效。

默认过滤器

如果要对所有的路由都生效,则可以将过滤器工厂写到default下。格式如下:

spring:cloud:gateway:routes:- id: user-service uri: lb://userservice predicates: - Path=/user/**default-filters: # 默认过滤项- AddRequestHeader=Truth, Itcast is freaking awesome! 
自定义全局过滤器

需求:定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:

  • 参数中是否有authorization,

  • authorization参数值是否为admin

如果同时满足则放行,否则拦截

实现:

在gateway中定义一个过滤器:

package cn.itcast.gateway.filters;import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1.获取请求参数MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();// 2.获取authorization参数String auth = params.getFirst("authorization");// 3.校验if ("admin".equals(auth)) {// 放行return chain.filter(exchange);}// 4.拦截// 4.1.禁止访问,设置状态码exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);// 4.2.结束处理return exchange.getResponse().setComplete();}
}
过滤器执行顺序

请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter

请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器:

在这里插入图片描述

排序的规则:

  • 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前
  • GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
  • 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。
  • 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。

详细内容,可以查看源码:

org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#getFilters()方法是先加载defaultFilters,然后再加载某个route的filters,然后合并。

org.springframework.cloud.gateway.handler.FilteringWebHandler#handle()方法会加载全局过滤器,与前面的过滤器合并后根据order排序,组织过滤器链

解决跨域问题

在gateway服务的application.yml文件中,添加下面的配置:

spring:cloud:gateway:# 。。。globalcors: # 全局的跨域处理add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题corsConfigurations:'[/**]':allowedOrigins: # 允许哪些网站的跨域请求 - "http://localhost:8090"allowedMethods: # 允许的跨域ajax的请求方式- "GET"- "POST"- "DELETE"- "PUT"- "OPTIONS"allowedHeaders: "*" # 允许在请求中携带的头信息allowCredentials: true # 是否允许携带cookiemaxAge: 360000 # 这次跨域检测的有效期

网关提示503错误,并且配置的地址信息都符合 查看是否配置的负载均衡的依赖

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency>

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

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

相关文章

【设计模式-02】23 种设计模式的分类和功能

在软件工程领域&#xff0c;设计模式是解决常见设计问题的经典方案。1994 年&#xff0c;Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides&#xff08;四人帮&#xff0c;GoF&#xff09;在《设计模式&#xff1a;可复用面向对象软件的基础》一书中系统性地总结了…

简历_专业技能_熟悉分布式锁Redisson的原理以及使用

系列博客目录 文章目录 系列博客目录怎么样才能够在简历上写熟悉redisson的应用以及原理1. 清晰描述技能与经验示例&#xff1a; 2. 列举具体应用场景示例项目经验&#xff1a; 3. 展示你对原理的理解示例&#xff1a; 4. 用简历中的关键词突出你的能力示例段落&#xff1a; 5.…

分布式任务调度xxl-job入门案例

XXL-JOB是一个分布式任务调度平台&#xff0c;简单来说就是可以在你指定的时间内调用某个功能&#xff0c;就例如购物某个商品的限时抢购从什么时候开始以及结束抢购类似于这样的。 下面是它的一个仓库地址 http://gitee.com/xuxueli0323/xxl-job 下载之后将项目导入进idea中&…

瑞芯微rk3566刷机流程(黑豹X2)

文章目录 概要 刷机方式 卡刷流程 线刷流程 小结 概要 记录rk3566刷机的过程&#xff0c;纯纯的小白&#xff0c;艰难而有意义的一天。 刷机方式 1、卡刷&#xff08;tf卡&#xff09; 2、线刷&#xff08;双公头usb线&#xff09; 卡刷流程 1、下载armbian镜像 1、…

计算机网络——数据链路层-流量控制和可靠传输

一、流量控制 流量控制是指由接收方及时控制发送方发送数据的速率&#xff0c;使接收方来得及接受。 • 停止等待流量控制 • 滑动窗口流量控制 1、停止—等待流量控制 停止-等待流量控制的基本原理是发送方每发出一帧后&#xff0c;就要等待接收方的应答信号&#xff…

GPT系统重大升级,开创国内先河:o1支持图片识别功能正式上线

文章目录 零、前言一、授权码登录体验优化&#xff1a;一步直达聊天界面二、全新“项目”功能&#xff1a;让工作更有条理三、语音功能升级&#xff1a;全新交互体验四、o1支持图片识别五、总结 零、前言 我是虚竹哥&#xff0c;目标是带十万人玩转ChatGPT。 亲爱的用户&…

RabbitMQ-基本使用

RabbitMQ: One broker to queue them all | RabbitMQ 官方 安装到Docker中 docker run \-e RABBITMQ_DEFAULT_USERrabbit \-e RABBITMQ_DEFAULT_PASSrabbit \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \--network mynet\-d \rabbitmq:3…

弹性云服务器ECS“规格”

规格详细资料&#xff1a;规格清单&#xff08;x86&#xff09;_弹性云服务器 ECS_华为云 通用计算型 各规格详细介绍请参见通用计算型。 规格名称 计算 磁盘类型 网络 通用计算型X1 CPU/内存配比&#xff1a;自定义vCPU数量范围&#xff1a;1-16处理器&#xff1a;第三…

Java SpringBoot使用Apache POI导入导出Excel文件

点击下载《Java SpringBoot使用Apache POI导入导出Excel文件(源代码)》 1. Apache POI 简介 Apache POI 是一个强大的 Java 库&#xff0c;用于处理 Microsoft Office 文档&#xff0c;包括 Excel 文件&#xff08;.xls 和 .xlsx&#xff09;。在 Java Spring Boot 项目中&am…

在 macOS 中,设置自动将文件夹排在最前

文章目录 1、第一步访达设置2、第二步排序方式 需要两步设置 1、第一步访达设置 按名称排序的窗口中 2、第二步排序方式 选择名称

汇编环境搭建

学习视频 将MASM所在目录 指定为C盘

Sentinel-5P遥感数据下载及预处理教程【20250105】

Sentinel-5P是欧空局&#xff08;Europe Space Agency&#xff0c;ESA&#xff09;于2017年10月13日发射的一颗全球大气污染监测卫星。卫星搭载了对流层观测仪&#xff08;Tropospheric Monitoring Instrument&#xff0c;TROPOMI&#xff09;&#xff0c;可以有效的观测全球各…

java项目之高校心理教育辅导系统的设计与实现(springboot+mybatis+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的闲一品交易平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 高校心理教育辅导系统的设…

打造三甲医院人工智能矩阵新引擎(一):文本大模型篇--基于GPT-4o的探索

一、引言 当今时代,人工智能技术正以前所未有的速度蓬勃发展,深刻且广泛地渗透至各个领域,医疗行业更是这场变革的前沿阵地。在人口老龄化加剧、慢性疾病患病率上升以及人们对健康需求日益增长的大背景下,三甲医院作为医疗体系的核心力量,承担着极为繁重且复杂的医疗任务。…

美的空气净化器好用吗?拾梧、美的、戴森空气净化器除烟哪个好?

说到二手烟&#xff0c;这可真是个让人头疼的问题&#xff01;它里面含有超过7000种化学物质&#xff0c;形式多样&#xff0c;处理起来比甲醛这些传统污染物难多了。在市场上那么多空气净化器里&#xff0c;要挑一个能真正对付二手烟的&#xff0c;简直就像大海捞针一样难。不…

WebRtc01:课程导学、框架介绍

应用 难点 课程大纲 学习收获 涉及内容 概述 用途 学习收获

电脑steam api dll缺失了怎么办?

电脑故障解析与自救指南&#xff1a;Steam API DLL缺失问题的全面解析 在软件开发与电脑维护的广阔天地里&#xff0c;我们时常会遇到各种各样的系统报错与文件问题&#xff0c;其中“Steam API DLL缺失”便是让不少游戏爱好者和游戏开发者头疼的难题之一。作为一名深耕软件开…

关系数据库查询与优化

关系数据库查询与优化 (1)查询所有没发表过文章的用户名(2)查询得票数大于100的所有文章标题,按得票数倒序排列(3)查询发表文章数大于5,文章平均得票数大于100的用户名,按平均得票数倒序排列(4)表的主键、外键和索引设计(5)大数据量下的存储及性能优化在关系数据库…

【Android项目学习】3. MVVMHabit

项目链接 文章目录 一. 项目结构1. 项目整体划分2. 模块细分 二. Android知识点学习1. registerActivityLifecycleCallbacks方法2. 一. 项目结构 1. 项目整体划分 MVVMHabit是以谷歌DataBindingLiveDataViewModel框架为基础&#xff0c;整合OkhttpRxJavaRetrofitGlide等流行…

GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程

大家好&#xff0c;今天给大家介绍一下&#xff1a;GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程。 文章目录 一、GPU算力平台概述人工智能智能发展为什么需要GPU算力平台 二、注册与登录账号注册流程 三、平台的应用之Anydoor应用启动器选择Anydoor的应用场景Anydoo…