SpringCloud学习第三天

  • 11 zuul路由网关
  • 12 Gateway新一代网关
    • 12.1 入门
    • 12.2 优化
    • 12.3 断言
      • 12.3.1 After 路由断言 Factory
      • 12.3.2 Before 路由断言 Factory
      • 12.3.3 Between 路由断言 Factory
      • 12.3.4 Cookie 路由断言 Factory
      • 12.3.5 Header 路由断言 Factory
      • 12.3.6 Host 路由断言 Factory
      • 12.3.7 Method 路由断言 Factory
      • 12.3.8 Path 路由断言 Factory
      • 12.3.9 Query 路由断言 Factory
      • 12.3.10 RemoteAddr 路由断言 Factory
      • 汇总
    • 12.4 Filter的使用
  • 13 SpringCloud Config分布式配置中心
    • 13.1 使用入门
    • 13.2 服务端从配置中心获取信息
    • 13.3 Config客户端之动态刷新
  • 14 SpringCloud Bus 消息总线
    • 14.1 全局通知
    • 14.2 定点通知
  • 15 SpringCloud Stream 消息驱动
    • 15.1 大概讲述
    • 15.2 消息的发送操作
    • 15.3 消息接收
    • 15.4分组消费与持久化

11 zuul路由网关

跳过~过后会发一个脑图 在脑图上可以看到zuul网关

12 Gateway新一代网关

在这里插入图片描述
在这里插入图片描述

12.1 入门

首先新建一个模块cloud-gateway-gateway9527
pom

<dependencies><!--gateway--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--eureka-client--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity --><dependency><groupId>com.atguigu.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>${project.version}</version></dependency><!--一般基础配置类--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

yml

server:port: 9527spring:application:name: cloud-gatewayeureka:instance:hostname: cloud-gateway-serviceclient: #服务提供者provider注册进eureka服务列表内service-url:register-with-eureka: truefetch-registry: truedefaultZone: http://eureka7001.com:7001/eureka

主启动类 需要开启注册到eureka中心的注解

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

因为这个是一个网关 所以我们不需要业务类
这样一个网关就做好了 9527网关如何做路由映射那???
我们目前不想暴露8001端口,希望在8001外面套一层9527

spring:application:name: cloud-gatewaycloud:gateway:routes:- id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名uri: http://localhost:8001          #匹配后提供服务的路由地址  //即转发地址predicates:- Path=/payment/get/**         # 断言,路径相匹配的进行路由  //即接口- id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名uri: http://localhost:8001          #匹配后提供服务的路由地址predicates:- Path=/payment/lb/**         # 断言,路径相匹配的进行路由

看看controller接口
在这里插入图片描述path填写的就是拦截的方法接口
最后启动
我们在地址栏输入 http://localhost:9527/payment/get/31
网关就会帮我们转发到对应的地址中去 就可以在不 暴露8001接口的情况下 进行数据的访问

当然除了yml方式 我们还可以通过bean的方式进行网关的配置
新建一个配置类:

package com.atguigu.springcloud.config;import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @Author XuZhuHong* @CreateTime 2021/11/5 16:42*/
@Configuration
public class GateWayConfig
{/*** 配置了一个id为route-name的路由规则,* 当访问地址 http://localhost:9527/guonei时会自动转发到地址:http://news.baidu.com/guonei* @param builder* @return*/@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder){RouteLocatorBuilder.Builder routes = builder.routes();routes.route("path_route_atguigu", r -> r.path("/guonei").uri("http://news.baidu.com/guonei")).build();return routes.build();}@Beanpublic RouteLocator customRouteLocator2(RouteLocatorBuilder builder){RouteLocatorBuilder.Builder routes = builder.routes();routes.route("path_route_atguigu2", r -> r.path("/guoji").uri("http://news.baidu.com/guoji")).build();return routes.build();}
}

然后当我们访问 http://localhost:9527/guonei 时就会帮我们 转发到http://news.baidu.com/guonei
但是当我们点击了其他没有做配置的地址时就会报错

12.2 优化

我们发现 上面的方式可以实现路由 但是地址是写死的 当我们服务增多后不方便调用
怎么解决呢? 通过微服务名实现动态路由
默认情况下Gateway会根据注册中心注册的服务列表,
以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能

只需要修改我们路由器的yml即可

server:port: 9527spring:application:name: cloud-gatewaycloud:gateway:discovery:locator:enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由routes:- id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名# uri: http://localhost:8001          #匹配后提供服务的路由地址uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path=/payment/get/**         # 断言,路径相匹配的进行路由- id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名# uri: http://localhost:8001          #匹配后提供服务的路由地址uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path=/payment/lb/**         # 断言,路径相匹配的进行路由eureka:instance:hostname: cloud-gateway-serviceclient: #服务提供者provider注册进eureka服务列表内service-url:register-with-eureka: truefetch-registry: truedefaultZone: http://eureka7001.com:7001/eureka

在这里插入图片描述
需要注意的是uri的协议为lb,表示启用Gateway的负载均衡功能。
在这里插入图片描述

lb://serviceName是spring cloud gateway在微服务中自动为我们创建的负载均衡

12.3 断言

在我们这个配置属性中 我们发现 有一个predicates配置 那么这个是什么呢 就是断言
简单来说就是 条件匹配 匹配的放行 不匹配 拦截
在这里插入图片描述断言有哪些配置的呢?

12.3.1 After 路由断言 Factory

After Route Predicate Factory采用一个参数——日期时间。在该日期时间之后发生的请求都将被匹配。

application.yml

spring:cloud:gateway:routes:- id: after_routeuri: http://example.orgpredicates:- After=2017-01-20T17:42:47.789-07:00[America/Denver]

怎么得到时间串?

ZonedDateTime zbj = ZonedDateTime.now(); // 默认时区System.out.println(zbj);
//        ZonedDateTime zny = ZonedDateTime.now(ZoneId.of("America/New_York")); // 用指定时区获取当前时间
//        System.out.println(zny);

12.3.2 Before 路由断言 Factory

Before Route Predicate Factory采用一个参数——日期时间。在该日期时间之前发生的请求都将被匹配。

application.yml.

spring:cloud:gateway:routes:- id: before_routeuri: http://example.orgpredicates:- Before=2017-01-20T17:42:47.789-07:00[America/Denver]

12.3.3 Between 路由断言 Factory

Between 路由断言 Factory有两个参数,datetime1和datetime2。在datetime1和datetime2之间的请求将被匹配。datetime2参数的实际时间必须在datetime1之后。

application.yml.

spring:cloud:gateway:routes:- id: between_routeuri: http://example.orgpredicates:- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]

12.3.4 Cookie 路由断言 Factory

Cookie 路由断言 Factory有两个参数,cookie名称和正则表达式。请求包含次cookie名称且正则表达式为真的将会被匹配。

application.yml

spring:cloud:gateway:routes:- id: cookie_routeuri: http://example.orgpredicates:- Cookie=chocolate, ch.p

12.3.5 Header 路由断言 Factory

Header 路由断言 Factory有两个参数,header名称和正则表达式。请求包含次header名称且正则表达式为真的将会被匹配。

application.yml.

spring:cloud:gateway:routes:- id: header_routeuri: http://example.orgpredicates:- Header=X-Request-Id, \d+

12.3.6 Host 路由断言 Factory

Host 路由断言 Factory包括一个参数:host name列表。使用Ant路径匹配规则,.作为分隔符。
application.yml.

spring:cloud:gateway:routes:- id: host_routeuri: http://example.orgpredicates:- Host=**.somehost.org,**.anotherhost.org

12.3.7 Method 路由断言 Factory

Method 路由断言 Factory只包含一个参数: 需要匹配的HTTP请求方式

application.yml.

spring:cloud:gateway:routes:- id: method_routeuri: http://example.orgpredicates:- Method=GET

所有GET请求都将被路由

12.3.8 Path 路由断言 Factory

Path 路由断言 Factory 有2个参数: 一个Spring PathMatcher表达式列表和可选matchOptionalTrailingSeparator标识 .

application.yml.

spring:cloud:gateway:routes:- id: host_routeuri: http://example.orgpredicates:- Path=/foo/{segment},/bar/{segment}

例如: /foo/1 or /foo/bar or /bar/baz的请求都将被匹配

URI 模板变量 (如上例中的 segment ) 将以Map的方式保存于
ServerWebExchange.getAttributes() key为
ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE.
这些值将在GatewayFilter Factories使用

可以使用以下方法来更方便地访问这些变量。

Map<String, String> uriVariables = ServerWebExchangeUtils.getPathPredicateVariables(exchange);String segment = uriVariables.get("segment");

12.3.9 Query 路由断言 Factory

Query 路由断言 Factory 有2个参数: 必选项 param 和可选项 regexp.

application.yml.

spring:cloud:gateway:routes:- id: query_routeuri: http://example.orgpredicates:- Query=baz

则包含了请求参数 baz的都将被匹配。

application.yml.

spring:cloud:gateway:routes:- id: query_routeuri: http://example.orgpredicates:- Query=foo, ba.

如果请求参数里包含foo参数,并且值匹配为ba. 表达式,则将会被路由,如:bar and baz

12.3.10 RemoteAddr 路由断言 Factory

RemoteAddr 路由断言 Factory的参数为 一个CIDR符号(IPv4或IPv6)字符串的列表,最小值为1,例如192.168.0.1/16(其中192.168.0.1是IP地址并且16是子网掩码)。

application.yml.

spring:cloud:gateway:routes:- id: remoteaddr_routeuri: http://example.orgpredicates:- RemoteAddr=192.168.1.1/24

如果请求的remote address 为 192.168.1.10则将被路由

汇总

 spring:application:name: cloud-gatewaycloud:gateway:discovery:locator:enabled: true #开启从注册中心动态创建路由的功能routes:- id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名# uri: http://localhost:8001          #匹配后提供服务的路由地址uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path=/payment/get/**         # 断言,路径相匹配的进行路由- id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名# uri: http://localhost:8001          #匹配后提供服务的路由地址uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path=/payment/lb/**         # 断言,路径相匹配的进行路由- After=2020-02-05T15:10:03.685+08:00[Asia/Shanghai]         # 断言,路径相匹配的进行路由#- Before=2020-02-05T15:10:03.685+08:00[Asia/Shanghai]         # 断言,路径相匹配的进行路由#- Between=2020-02-02T17:45:06.206+08:00[Asia/Shanghai],2020-03-25T18:59:06.206+08:00[Asia/Shanghai]#- Cookie=username,zzyy#- Header=X-Request-Id, \d+  # 请求头要有X-Request-Id属性并且值为整数的正则表达式#- Host=**.atguigu.com- Method=GET- Query=username, \d+  # 要有参数名username并且值还要是整数才能路由

12.4 Filter的使用

路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。

Spring Cloud Gateway 内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生

如果用官方的 可以参考断言的写法
在这里插入图片描述
这里讲一下 自定义全局GlobalFilter 过滤器
自定义过滤器必须实现 两个接口 GlobalFilter,Ordered

package com.atguigu.springcloud.filter;import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Date;@Component //必须加,必须加,必须加
public class MyLogGateWayFilter implements GlobalFilter,Ordered
{@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain){//exchange类似于servlet  //chain 是下一个数据  用于返回 可以看returnSystem.out.println("time:"+new Date()+"\t 执行了自定义的全局过滤器: "+"MyLogGateWayFilter"+"hello");String uname = exchange.getRequest().getQueryParams().getFirst("uname");if (uname == null) {System.out.println("****用户名为null,无法登录");exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);return exchange.getResponse().setComplete();}return chain.filter(exchange);}@Overridepublic int getOrder(){	//数字越小  执行越靠前return 0;}
}

13 SpringCloud Config分布式配置中心

微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。

SpringCloud提供了ConfigServer来解决这个问题,我们每一个微服务自己带着一个application.yml,上百个配置文件的管理…
/(ㄒoㄒ)/~~

在这里插入图片描述

13.1 使用入门

这里会采用码云的仓库
首先用自己的帐号 创建一个springcloud-config仓库
然后编写几个配置文件
文件名为:
在这里插入图片描述
文件内容

config:info: 2021/11/6      config-prod.yml Version=1.0

新建配置中心模块 cloud-config-center-3344

<dependencies><dependency>
<!--            表示这个是配置中心的文件--><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

yml


server:port: 3344spring:application:name:  cloud-config-center #注册进Eureka服务器的微服务名cloud:config:server:git:uri: https://gitee.com/x229827570/springcloud-config/ #仓库上面的git仓库名字####搜索目录search-paths:- springcloud-config####读取分支label: master#服务注册到eureka地址
eureka:client:service-url:defaultZone: http://localhost:7001/eureka

主启动类 不要忘记加上注解 @EnableConfigServer 开启配置中心端

@SpringBootApplication
@EnableConfigServer //开启springcloudconfig服务端的注解
public class ConfigCenterMain3344
{public static void main(String[] args) {SpringApplication.run(ConfigCenterMain3344.class, args);}
}

然后运行 当我们访问 http://config-3344.com:3344/master/config-dev.yml 时就会看到如下界面
不要忘记在本地host里做映射哟~
在这里插入图片描述
连接成功

13.2 服务端从配置中心获取信息

新建模块cloud-config-client-3355
修改pom

 <dependencies><dependency><!--客户端的config的依赖  和服务端有所不同 --><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

新建yml
注意 这里的yml有所不同 之前是application.yml
现在需要新建的是bootstrap.yml 那么他是什么?

applicaiton.yml是用户级的资源配置项
bootstrap.yml是系统级的,优先级更加高
Spring Cloud会创建一个“Bootstrap Context”,作为Spring应用的Application Context的父上下文。初始化的时候,Bootstrap Context负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的Environment
Bootstrap属性有高优先级,默认情况下,它们不会被本地配置覆盖。 Bootstrap contextApplication Context有着不同的约定,所以新增了一个bootstrap.yml文件,保证Bootstrap ContextApplication Context配置的分离。
要将Client模块下的application.yml文件改为bootstrap.yml,这是很关键的,
因为bootstrap.yml是比application.yml先加载的。bootstrap.yml优先级高于application.yml

内容

server:port: 3355spring:application:name: config-clientcloud:#Config客户端配置config:label: master #分支名称name: config #配置文件名称profile: dev #读取后缀名称   上述3个综合:master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.ymluri: http://localhost:3344 #配置中心地址k#服务注册到eureka地址
eureka:client:service-url:defaultZone: http://localhost:7001/eureka

创建启动类

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

业务类

@RestController
public class ConfigClientController
{@Value("${config.info}")private String configInfo;@GetMapping("/configInfo")public String getConfigInfo() {return configInfo;}
} 

最后当我们启动时就可以发现一样可以获取文件
但是当我们文件刷新时 发现客户端并不能实时获取到消息
那么怎么办呢

13.3 Config客户端之动态刷新

避免每次更新配置都要重启客户端微服务3355
首先在客户端引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

修改yml

# 暴露监控端点
management:endpoints:web:exposure:include: "*" 

再修改controller 在业务类上加上 @RefreshScope 注解

@RestController
@RefreshScope
public class ConfigClientController
{@Value("${config.info}")private String configInfo;@GetMapping("/configInfo")public String getConfigInfo() {return configInfo;}
} 

在维护人员修改配置后 向客户端发送
curl -X POST "http://localhost:3355/actuator/refresh 命令 即可发现已经改变

成功实现了客户端3355刷新到最新配置内容

但是依然存在问题:
在这里插入图片描述怎么解决呢

14 SpringCloud Bus 消息总线

14.1 全局通知

在使用消息总线之前 首先要安装RabbitMQ
这里用的是erlang21.3和rabbitmq-server-3.7.14
然后我们在之前的
cloud-config-center-3344配置中心服务端
cloud-config-client-3355/3366客户端添加RabbitMQ服务支持

<!--添加消息总线RabbitMQ支持-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

然后在yml配置文件里写对应的配置
首先是3344 对应的配置 两个点

server:port: 3344spring:application:name:  cloud-config-center #注册进Eureka服务器的微服务名cloud:config:server:git:uri: https://gitee.com/x229827570/springcloud-config/ #仓库上面的git仓库名字####搜索目录search-paths:- springcloud-config####读取分支label: master#rabbitmq相关配置   主要是这里------------------rabbitmq:host: localhostport: 5672username: guestpassword: guest#服务注册到eureka地址
eureka:client:service-url:defaultZone: http://localhost:7001/eureka##rabbitmq相关配置,暴露bus刷新配置的端点
management:endpoints: #暴露bus刷新配置的端点   主要是这里------------------web:exposure:include: 'bus-refresh'

然后是 3355 和3366端口的yml

server:port: 3366spring:application:name: config-clientcloud:#Config客户端配置config:label: master #分支名称name: config #配置文件名称profile: dev #读取后缀名称   上述3个综合:master分支上config-dev.yml的配置文件被读取uri: http://localhost:3344 #配置中心地址k
#rabbitmq相关配置 15672是Web管理界面的端口;5672是MQ访问的端口
# 主要是这里------------------rabbitmq:host: localhostport: 5672username: guestpassword: guest#服务注册到eureka地址
eureka:client:service-url:defaultZone: http://localhost:7001/eureka
# 暴露监控端点   主要是这里------------------
management:endpoints:web:exposure:include: "*"   # 'refresh'

最后我们先启动eureka和3344 等都启动 完毕 再启动3355 和3366
当我们在码云上修改了代码后 在cmd中执行这个命令 我们就会发现所有的信息都跟着一起修改了

curl -X POST “http://localhost:3344/actuator/bus-refresh”

14.2 定点通知

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
执行下面代码即可实现

curl -X POST “http://localhost:3344/actuator/bus-refresh/config-client:3355”

bus-refresh就是之前在3344 yml配置中 书写的暴露刷新的接口

15 SpringCloud Stream 消息驱动

15.1 大概讲述

解决了消息插件不同 所带来的问题
屏蔽底层消息中间件的差异,降低切换成本,统一消息的编程模型
为什么使用他

比方说我们用到了RabbitMQ和Kafka,由于这两个消息中间件的架构上的不同,
像RabbitMQ有exchange,kafka有Topic和Partitions分区,

这些中间件的差异性导致我们实际项目开发给我们造成了一定的困扰,我们如果用了两个消息队列的其中一种,后面的业务需求,我想往另外一种消息队列进行迁移,这时候无疑就是一个灾难性的,一大堆东西都要重新推倒重新做,因为它跟我们的系统耦合了,这时候springcloud Stream给我们提供了一种解耦合的方式。
在这里插入图片描述
常用的注解如下
在这里插入图片描述

15.2 消息的发送操作

在进行这些操作前 我们首先要保证 RabbitMQ环境已经OK
创建一个模块cloud-stream-rabbitmq-provider8801, 作为生产者进行发消息模块
pom

    <dependencies><!--因为这里用的是rabbitmq 所以要引入rabbit的东西--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-rabbit</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!--基础配置--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

yml 他的binder属性可能会报红 不用管 依然可以运行

server:port: 8801spring:application:name: cloud-stream-providercloud:stream:binders: # 在此处配置要绑定的rabbitmq的服务信息;defaultRabbit: # 表示定义的名称,用于于binding整合type: rabbit # 消息组件类型  这里用的是rabbitmqenvironment: # 设置rabbitmq的相关的环境配置spring:rabbitmq:host: localhostport: 5672username: guestpassword: guestbindings: # 服务的整合处理output: # output 代表消息的发送端 这个名字是一个通道的名称 destination: studyExchange # 表示要使用的Exchange名称定义content-type: application/json # 设置消息类型,本次为json,文本则设置“text/plain”binder: defaultRabbit # 设置要绑定的消息服务的具体设置eureka:client: # 客户端进行Eureka注册的配置service-url:defaultZone: http://localhost:7001/eurekainstance:lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)instance-id: send-8801.com  # 在信息列表时显示主机名称prefer-ip-address: true     # 访问的路径变为IP地址

主启动

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

一个简单的service接口

public interface IMessageProvider{public String send() ;
}

他的实现类 注意的是 不要引错包了 而且不需要service注解就能实现调用的

package com.atguigu.springcloud.service.impl;import com.atguigu.springcloud.service.IMessageProvider;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.MessageBuilder;import javax.annotation.Resource;
import java.util.UUID;/*** @Author XuZhuHong* @CreateTime 2021/11/6 18:05*/
@EnableBinding(Source.class) //Source表示是消息的发送者
public class MessageProviderImpl implements IMessageProvider {@Resourceprivate MessageChannel output;  //发送消息需要的组件@Overridepublic String send() {String serial = UUID.randomUUID().toString();//把消息放入消息队列中output.send(MessageBuilder.withPayload(serial).build());System.out.println(serial);return serial;}
}

简单的controller接口

@RestController
public class SendMessageController
{@Resourceprivate IMessageProvider messageProvider;@GetMapping(value = "/sendMessage")public String sendMessage(){return messageProvider.send();}
}

当我们成功跑起这个服务的时候
就可以在robbinMQ的可视化页面中 多了一个通道
在这里插入图片描述
这个通道就是我们之前设置的
在这里插入图片描述
当我们疯狂刷新的时候 就可以在可视化的界面中 看到波峰图

15.3 消息接收

创建一个 cloud-stream-rabbitmq-consumer8802

   <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-rabbit</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--基础配置--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

yml

server:port: 8802spring:application:name: cloud-stream-consumercloud:stream:binders: # 在此处配置要绑定的rabbitmq的服务信息;defaultRabbit: # 表示定义的名称,用于于binding整合type: rabbit # 消息组件类型environment: # 设置rabbitmq的相关的环境配置spring:rabbitmq:host: localhostport: 5672username: guestpassword: guestbindings: # 服务的整合处理input: # input表示他是接收端口 这个名字是一个通道的名称destination: studyExchange # 表示要使用的Exchange名称定义  通道content-type: application/json # 设置消息类型,本次为对象json,如果是文本则设置“text/plain”  接收的数据binder: defaultRabbit # 设置要绑定的消息服务的具体设置eureka:client: # 客户端进行Eureka注册的配置service-url:defaultZone: http://localhost:7001/eurekainstance:lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)instance-id: receive-8802.com  # 在信息列表时显示主机名称prefer-ip-address: true     # 访问的路径变为IP地址

主启动类

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

controller类 需要加上@EnableBinding(Sink.class) 注解 表示开启 并且是接收方

@Controller
@EnableBinding(Sink.class) //EnableBinding开启这个消息绑定  sink表示这个是接收方
public class ReceiveMessageListener {@Value("${server.port}")private String serverPort;@StreamListener(Sink.INPUT)  //Sink.INPUT表示这是接收的方法//简单的一个接收的方法  其中的接收的方法参数为固定的public void input(Message<String> message){System.out.println("消费者1号,------->接收到的消息:" + message.getPayload()+"\t port: "+serverPort);}
}

那么当我们把这个类启动
再访问 消息发送者 http://localhost:8801/sendMessage
就会在我们接受者方看到消息
在这里插入图片描述

15.4分组消费与持久化

当我们再仿造8802端口8803 运行 我们发现 发送消息的时候 两个消费者都会读取这条消息
造成重复消费 怎么解决呢

微服务应用放置于同一个group中,就能够保证消息只会被其中一个应用消费一次。
不同的组是可以消费的,同一个组内会发生竞争关系,只有其中一个可以消费。

其实很简单加上group即可 两个group相同 就可以解决这个问题了
在这里插入图片描述
另外添加分组还可以有效的防止消息丢失 (即当消息发送者发送了消息 然后没有接收者 当我们启动 没有分组的接收者时 就不会接收到消息 但是启动分了组的接收者就可以接收 )

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

相关文章

  1. GRE OVER IPSEC(野蛮模式)

    ## 野蛮模式适用于两端其中有一端地址不固定的情况 实验拓扑 实验思路 1.配置全网地址&#xff08;这里的地址已经在图上规划&#xff0c;不在赘述&#xff09; 2.配置ike 3.配置ipsec 4.配置GRE 地址配置完成之后&#xff0c;首先要保证公网可达&#xff0c;因为RT3和RT4是D…...

    2024/4/14 21:30:33
  2. 用链表来实现堆栈

    数组结构实现堆栈较为简单&#xff0c;但因为如果堆栈本身是变动的话&#xff0c;数组大小并无法实现规划声明&#xff0c;因此&#xff0c;使用链表来实现堆栈可以随时改变链表的长度&#xff0c;不过缺点是设计算法较为复杂。 package Stack;public class StackBylink {publ…...

    2024/4/20 13:37:25
  3. deque用法

    双端队列 int main() {deque<int> dq;dq.push_back(3); // 3dq.push_back(4); //3 4dq.push_back(5); // 3 4 5dq.push_front(6); //6 3 4 5dq.push_front(7); //7 6 3 4 5dq.push_front(8); //8 7 6 3 4 5cout << dq.front() << " " << …...

    2024/4/14 21:30:33
  4. SpringMVC 中 @ControllerAdvice 注解回顾

    ControllerAdvice &#xff0c;很多初学者可能都没有听说过这个注解&#xff0c;实际上&#xff0c;这是一个非常有用的注解&#xff0c;顾名思义&#xff0c;这是一个增强的 Controller。使用这个 Controller &#xff0c;可以实现三个方面的功能&#xff1a; 全局异常处理全…...

    2024/4/14 21:30:18
  5. LeetCode4-寻找两个正序数组的中位数

    题意&思路 题意&#xff1a;两个正数单调不减的整数数组&#xff0c;找到这两个数组中的中位数 思路&#xff1a;一开始我考虑直接在两个数组中找到中位数对应的元素&#xff0c;这样节省空间&#xff0c;但是试了一下情况实在是太多了&#xff0c;因为无法知道连续两个数…...

    2024/4/14 21:30:33
  6. 如何让类不能被继承

    方法一&#xff1a;借助 final 关键字&#xff0c;用该关键字修饰的类不能被继承 #include <iostream>using namespace std;class Base final { };class Derive: public Base{ // error: cannot derive from final base Base in derived type Derive};int main() {Deriv…...

    2024/4/14 21:30:43
  7. C++访问修饰符 protected

    protected&#xff08;受保护&#xff09;成员 protected&#xff08;受保护&#xff09;成员变量或函数与私有成员十分相似&#xff0c;但有一点不同&#xff0c;protected&#xff08;受保护&#xff09;成员在派生类&#xff08;即子类&#xff09;中是可访问的。...

    2024/4/18 11:47:13
  8. C++ boost对称协程介绍与代码演示

    boost提供的对称协程 symmetric_coroutine<>::call_type symmetric_coroutine<>::yield_type 与调用者和被调用者之间的关系是固定的非对称协程相反,对称协程能够将执行控制转移到任何其他(对称)协程。例如,对称协程不需要返回到它的直接调用者。 symmetry_…...

    2024/4/5 5:40:44
  9. SpringBoot:参数处理原理 ---- 8.3

    sss继 《SpringBoot&#xff1a;参数处理原理 ---- 8.2》这篇文章&#xff0c;我们继续分析复杂参数的请求原理&#xff0c;其实和上篇文章的过程差不多&#xff0c;也就是变相的分析mv返回后&#xff0c;我们怎么处理。 复杂参数 例子&#xff1a; 为什么Map,Model参数解析后存…...

    2024/4/5 5:40:43
  10. 基于SSM的猫头鹰物流网站

    项目介绍&#xff1a; 本系统采用SSM框架&#xff0c;数据层采用mybatis&#xff0c;数据库使用mysql&#xff0c;下面是大概的功能。 项目技术&#xff1a; 后端&#xff1a;ssm 前端&#xff1a;easyui、js、css等 开发工具&#xff1a;eclipse 数据库&#xff1a;mysql 5…...

    2024/4/14 21:31:34
  11. Spark——集群搭建

    这里搭建的集群只使用spark自身节点运行的集群模式——独立部署&#xff08;Standalone&#xff09;模式。 1.上传并解压文件 &#xff08;1&#xff09;上传spark-3.0.0-bin-hadoop3.2.tgz文件到/opt/software目录下 &#xff08;2&#xff09;解压spark-3.0.0-bin-hadoop3…...

    2024/4/14 21:31:34
  12. Leetcode算法题:树的最大深度(回溯、动规、BFS)

    1、输入一棵二叉树的根节点&#xff0c;求该树的深度。从根节点到叶节点依次经过的节点&#xff08;含根、叶节点&#xff09;形成树的一条路径&#xff0c;最长路径的长度为树的深度。 例如&#xff1a; 给定二叉树 [3,9,20,null,null,15,7]&#xff0c; 3 / \ 9 20 …...

    2024/4/7 3:00:53
  13. nginx在Linux的安装和简单使用

    文章目录安装下载安装包和依赖安装nginx的配置文件反向代理配置安装 下载安装包和依赖 浏览器中输入http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz即可下载 下载nginx的安装包 http://nginx.org/en/download.html 安装 tar –xvf pcre-8.37.…...

    2024/4/19 20:50:28
  14. leetcode 70. 爬楼梯 (Java)

    题目描述&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正整数 这里使用的是动态规划解决问题&#xff0c;可以观察发现后一步的次数与前面的次数…...

    2024/4/14 21:31:29
  15. 2021-11-06​Java是一门面向对象​

    Java是一门编程语言&#xff0c;不仅吸收了C语言的各种优点&#xff0c;还摒弃了C里难以理解的多继承、指针等概念&#xff0c;因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表&#xff0c;极好地实现了面向对象理论&#xff0c;允许程序…...

    2024/4/7 3:00:51
  16. 手动搭建webpack5 react17项目

    git 地址 https://github.com/yexianli/react17webapck5...

    2024/4/14 21:31:29
  17. SpringMVC+MyBatis+MAVEN+EHCacahe整合BUG处理

    需要注意的是下面的自定义的cache。后面会有对应的详细解释&#xff1b; 3.整合spring&#xff1a; 在配置文件中加入ehcache的相关配置代码&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns“http://www.springframework.o…...

    2024/4/7 3:00:48
  18. SpringSecurity权限框架(终✧章)

    ☣SpringSecurity权限框架&#xff08;终✧章&#xff09; 终✧章☣SpringSecurity权限框架&#xff08;终✧章&#xff09;一、JWT1、常用的WEB集中认证机制2、什么是JWT&#xff1f;✧ 优点✧ 缺点✧ 整体三部分3、JWT快速入门① 引入依赖② 编写测试类二、Spring Security O…...

    2024/4/14 21:31:24
  19. MAC全局安装yarn

    1、sudo -s 2、npm i yarn -g alingnaalingnadeMacBook-Pro ~ % sudo -s Password: Sorry, try again. Password: rootalingnadeMacBook-Pro ~ # npm i yarn tyarn -gadded 8 packages, and audited 9 packages in 10sfound 0 vulnerabilities rootalingnadeMacBook-Pro ~ # t…...

    2024/4/19 12:26:57
  20. 基于Redis实现分布式锁(超详细)

    本文将从基于Redis实现分布式锁的几种坑的解决一步一步的进入到使用lua脚本Redis 首先&#xff1a;实现分布式锁 可以⽤ Redis、Zookeeper、Mysql数据库这⼏种 , 性能最好的是Redis且是最容易理解&#xff0c; 同时 设计分布式锁应该考虑的东⻄&#xff1a; 排他性 在分布式应…...

    2024/4/17 21:37:37

最新文章

  1. ttcp测试网络吞吐量

    计算机网络中的几个性能指标 带宽&#xff1a;用来表示网络的通信线路传送数据的能力&#xff0c;通常是指单位时间内从网络中的某一点通过另一点的最高数据率&#xff0c;即网络设备所支持的最高速度 吞吐量&#xff1a;表示单位时间内通过某个网络&#xff08;或信道、接口&…...

    2024/4/27 7:32:11
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 腾讯云轻量服务器流量不够用了会怎么样?

    腾讯云轻量应用服务器是限制月流量的&#xff0c;如果当月流量不够用了&#xff0c;流量超额了怎么办&#xff1f;流量超额后&#xff0c;需要另外支付流量费&#xff0c;如果你的腾讯云账号余额&#xff0c;就会自动扣除对应的流量费&#xff0c;如果余额不足&#xff0c;轻量…...

    2024/4/23 6:15:09
  4. 【项目新功能开发篇】开发编码

    作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…...

    2024/4/23 6:10:38
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/26 18:09:39
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/26 20:12:18
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/27 4:00:35
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/25 18:39:22
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/25 18:39:22
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/26 21:56:58
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/25 16:48:44
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/26 16:00:35
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/25 18:39:16
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/26 22:01:59
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/25 2:10:52
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/25 18:38:58
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/25 18:38:57
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57