好好学习,天天向上

本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航

  • 畅购商城(一):环境搭建
  • 畅购商城(二):分布式文件系统FastDFS
  • 畅购商城(三):商品管理
  • 畅购商城(四):Lua、OpenResty、Canal实现广告缓存与同步
  • 畅购商城(五):Elasticsearch实现商品搜索
  • 畅购商城(六):商品搜索
  • 畅购商城(七):Thymeleaf实现静态页
  • 畅购商城(八):微服务网关和JWT令牌
  • 畅购商城(九):Spring Security Oauth2
  • 畅购商城(十):购物车

OAuth2.0对接用户微服务

上一篇文章中提到过,访问资源服务的时候,需要携带令牌去进行权限校验。那么用户微服务也是资源服务,所以需要对其进行配置,首先添加OAuth2.0的依赖

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

然后把之前导出的public.key放到用户微服务的resources目录下。最后添加一个配置类即可,配置类上需要添加**@EnableResourceServer注解,然后继承自ResourceServerConfigurerAdapter**。

@Configuration
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)//激活方法上的PreAuthorize注解
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {private static final String PUBLIC_KEY = "public.key";//公钥/**** 定义JwtTokenStore* @param jwtAccessTokenConverter* @return*/@Beanpublic TokenStore tokenStore(JwtAccessTokenConverter jwtAccessTokenConverter) {return new JwtTokenStore(jwtAccessTokenConverter);}/**** 定义JJwtAccessTokenConverter* @return*/@Beanpublic JwtAccessTokenConverter jwtAccessTokenConverter() {JwtAccessTokenConverter converter = new JwtAccessTokenConverter();converter.setVerifierKey(getPublicKey());return converter;}/*** 获取非对称加密公钥 Key* @return 公钥 Key*/private String getPublicKey() {Resource resource = new ClassPathResource(PUBLIC_KEY);try {InputStreamReader inputStreamReader = new InputStreamReader(resource.getInputStream());BufferedReader br = new BufferedReader(inputStreamReader);return br.lines().collect(Collectors.joining("\n"));} catch (IOException ioe) {return null;}}/**** Http安全配置,对每个到达系统的http请求链接进行校验* @param http* @throws Exception*/@Overridepublic void configure(HttpSecurity http) throws Exception {//所有请求必须认证通过http.authorizeRequests()//下边的路径放行.antMatchers("/user/add,user/load/*").permitAll() //配置 /user/add /user/load/*不需要权限.anyRequest().authenticated();    //其他地址需要认证授权}}

这样配置类就配置好了,在添加了**@EnableGlobalMethodSecurity**注解后,就可以在指定的方法上面添加注解来进行权限控制。

比如:

@PreAuthorize("hasAnyAuthority('admin')")	//表示该方法只有admin才能访问
@PutMapping(value = "/{id}")
public Result update(@RequestBody User user, @PathVariable String id) {
………………

这样用户微服务就配置好了。

网关配置

访问微服务的JWT令牌是放在请求头中一个叫“Authorization”的参数中。以“bearer”开头。因为请求是通过网关转发给相应的微服务,所以可以对网关进行配置。之前在网关微服务中写了一个过滤器叫AuthorizeFilter,里面的**filter()**方法写的是分别从请求头、参数、Cookie中获取token信息,然后进行校验。现在稍微修改一下,现在不校验了,只判断有无token信息并进行简单处理。

还有一点就是有些请求比如登录注册等不需要token的就直接放行。

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {…………if (needlessToken(request.getURI().toString())) {return chain.filter(exchange);	//如果是不需要token的请求就直接放行}//还是没有Token就拦截if (StringUtils.isEmpty(token)){response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();} else {if (!hasTokenInHeader) {if (!(token.startsWith("brarer ") || token.startsWith("Bearer "))) {token = "Bearer " + token;}request.mutate().header("Authorization",token);}}//Token不为空就校验Token// try {//     JwtUtil.parseJWT(token);// } catch (Exception e) {//     //报异常说明Token是错误的,拦截//     response.setStatusCode(HttpStatus.UNAUTHORIZED);//     return response.setComplete();// }return chain.filter(exchange);
}//判断指定的uri是否不需要token就可以访问,true表示不需要
public boolean needlessToken(String uri) {String[] uris = new String[]{"/api/user/add","/api/user/login"};for (String s : uris) {if (s.equals(uri)) {return true;}}return false;
}

代码的意思就是如果请求头中有token的信息就不去管它,如果token在参数或者Cookie中,就看是不是以“**Bearer **”开头,不是的话就添加“Bearer ”,然后存入请求头中。如果是指定的不需要token的请求就直接放行。为什么现在不校验呢?因为校验的工作交给对应的微服务去处理了,网关不负责。

OAuth2.0从数据库加载数据

在之前的配置中,客户端的信息是配置在内存中的。用户也是在内存中指定的。现在来改造一下,从数据库中加载数据。首先是客户端信息,修改AuthorizationServerConfig中的configure()方法。

// 客户端信息配置
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {clients.jdbc(dataSource).clients(clientDetails());
}
//客户端配置
@Bean
public ClientDetailsService clientDetails() {return new JdbcClientDetailsService(dataSource);
}

我们给客户端配置了一个JdbcClientDetailsService

然后就可以从oauth_client_details中加载数据了。

咦?好像没有在任何地方指定这张表呀,怎么就能从这张表里面加载数据???前面不是配了个JdbcClientDetailsService么。点进去看看

哦~ 原来是在JdbcClientDetailsService的内部指定好了呀。


现在就是从数据库中加载了客户端的信息,那怎么加载用户的信息呢?这里使用Feign接口去调用用户微服务查询出用户的信息。

//用户微服务中的UserController
@GetMapping({"/{id}","/load/{id}"})
public Result<User> findById(@PathVariable String id) {//调用UserService实现根据主键查询UserUser user = userService.findById(id);return new Result<User>(true, StatusCode.OK, "查询成功", user);
}

我们给这个方法配置一个“load/{id}”的路径。之前已经配置过这个路径放行了。

然后在用户的api微服务中添加一个Feign接口。

@FeignClient("user")
@RequestMapping("/user")
public interface UserFeign {//根据ID查询User数据@GetMapping({"/load/{id}"})Result<User> findById(@PathVariable String id);}

这样在认证微服务的UserDetailsServiceImpl的**loadUserByUsername()**方法中就可以调用Feign去数据库中查询用户信息了。

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {/*客户端信息认证*///取出身份,如果身份为空说明没有认证Authentication authentication = SecurityContextHolder.getContext().getAuthentication();//没有认证统一采用httpbasic认证,httpbasic中存储了client_id和client_secret,开始认证client_id和client_secretif(authentication==null){ClientDetails clientDetails = clientDetailsService.loadClientByClientId(username);if(clientDetails!=null){//秘钥String clientSecret = clientDetails.getClientSecret();//数据库查找方式return new User(username,clientSecret, AuthorityUtils.commaSeparatedStringToAuthorityList(""));}}/*用户信息认证*/if (StringUtils.isEmpty(username)) {return null;}com.robod.user.pojo.User user = userFeign.findById(username).getData();	//查询用户if (user == null ) {return null;}//根据用户名查询用户信息String pwd = user.getPassword();//创建User对象String permissions = "goods_list,seckill_list";UserJwt userDetails = new UserJwt(username,pwd,AuthorityUtils.commaSeparatedStringToAuthorityList(permissions));return userDetails;
}

这样就OK了,来测试一下。

这个robod用户是保存在数据库中的,可以正常登录,说明我们的配置是没有问题的。

微服务之间的令牌传递

在实现购物车功能之前,要先明确一个问题,只有登录过的用户才可以访问自己的购物车。所以我们在访问微服务的时候必须要携带令牌,但是还涉及到微服务之间的Feign接口调用,令牌该怎么传递过去呢?令牌不是放在名为“Authorization”的请求头中吗,所以加一个过滤器在Feign调用前调用,将当前请求的请求头信息封装到Feign请求的请求头中。但是呢,这个过滤器是很多微服务共用的,所以可以将这个过滤器放在common工程中,哪个微服务需要就直接注入到Spring容器中。

public class FeignHeaderInterceptor implements RequestInterceptor {//Feign调用前调用@Overridepublic void apply(RequestTemplate template) {ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();if (requestAttributes != null) {HttpServletRequest request = requestAttributes.getRequest();Enumeration<String> headerNames = request.getHeaderNames();//所有请求头的名字集合if (headerNames != null) {while (headerNames.hasMoreElements()) {String headerName = headerNames.nextElement();String headerValue = request.getHeader(headerName);template.header(headerName,headerValue);}}}}
}

如果哪个微服务想要调用的话,就直接在启动类中注入即可。

@Bean
public FeignHeaderInterceptor feignHeaderInterceptor() {return new FeignHeaderInterceptor();
}

这样就可以实现令牌在不同微服务之间的传递。

购物车

现在就可以来实现购物车的功能了,因为购物车毕竟是用来下单的,所以就将购物车功能写在订单微服务中。创建一个订单微服务changgou-service-order以及一个订单的api工程changgou-service-order-api。

从令牌中获取用户名

添加到购物车的流程就是用户从前端将商品的id和数量以及令牌传过来。然后解析令牌,拿到用户名。然后拿着商品的id用Feign调用Goods微服务将Sku和Spu查询出来,然后封装成一个OrderItem对象,存入Reids中。这个时候Feign接口的调用就涉及到微服务之间的令牌传递问题了,把FeignHeaderInterceptor注入即可。

这里还有一个问题,就是令牌解析,很简单,使用公钥解析即可,封装一个工具类com.robod.order.utils.TokenDecodeUtil

@Component
public class TokenDecodeUtil {//公钥路径private static final String PUBLIC_KEY_PATH = "public.key";//公钥的内容private static String publicKey="";/**** 获取用户信息* @return*/public Map<String,String> getUserInfo() {//获取授权信息OAuth2AuthenticationDetails authentication = (OAuth2AuthenticationDetails) SecurityContextHolder.getContext().getAuthentication().getDetails();//令牌解码return decodeToken(authentication.getTokenValue());}/**** 读取令牌数据*/public Map<String,String> decodeToken(String token){//校验JwtJwt jwt = JwtHelper.decodeAndVerify(token, new RsaVerifier(getPubKey()));//获取Jwt原始内容String claims = jwt.getClaims();return JSON.parseObject(claims,Map.class);}/*** 获取非对称加密公钥 Key* @return 公钥 Key*/public String getPubKey() {if(!StringUtils.isEmpty(publicKey)){return publicKey;}Resource resource = new ClassPathResource(PUBLIC_KEY_PATH);try {InputStreamReader inputStreamReader = new InputStreamReader(resource.getInputStream());BufferedReader br = new BufferedReader(inputStreamReader);publicKey = br.lines().collect(Collectors.joining("\n"));return publicKey;} catch (IOException ioe) {return null;}}}

准备工作做好以后就可以编写相应的逻辑了。

添加到购物车

//     CartController
@GetMapping("/add")
public Result add(long id,int num) {String username = tokenDecodeUtil.getUserInfo().get("username");cartService.add(id,num,username);return new Result(true, StatusCode.OK,"成功添加到购物车");
}
//-----------------------------------------------------------------------
//     CartServiceImpl
@Override
public void add(long id, int num, String username) {BoundHashOperations boundHashOperations = redisTemplate.boundHashOps("Cart_" + username);if (num <= 0){boundHashOperations.delete(id);Long size = boundHashOperations.size();if (size == null || size<=0) {redisTemplate.delete("Cart_" + username);}return;}Sku sku = skuFeign.findById(id).getData();if (sku == null) {throw new RuntimeException("未查询到商品信息");}Spu spu = spuFeign.findById(sku.getSpuId()).getData();if (spu == null) {throw new RuntimeException("数据库中数据异常");}OrderItem orderItem = createOrderItem(spu,sku,num);boundHashOperations.put(id,orderItem);
}private OrderItem createOrderItem(Spu spu,Sku sku,int num) {OrderItem orderItem = new OrderItem();orderItem.setCategoryId1(spu.getCategory1Id());orderItem.setCategoryId2(spu.getCategory2Id());orderItem.setCategoryId3(spu.getCategory3Id());orderItem.setSpuId(spu.getId());orderItem.setSkuId(sku.getId());orderItem.setName(sku.getName());orderItem.setNum(num);orderItem.setPrice(sku.getPrice());orderItem.setMoney(num * sku.getPrice());orderItem.setImage(spu.getImage());return orderItem;
}

但是现在访问的话还存在问题,FeignHeaderInterceptor里面ServletRequestAttributes的数据

这是因为现在的feign的隔离策略是THREAD(线程池隔离),这时候使用Feign的时候是单独开启一个线程的,不是之前的线程,所以获取不到数据。要想使用同一个线程去使用feign,可以把隔离策略设置成SEMAPHORE(信号量隔离)。在order微服务的配置文件中添加一段配置

#hystrix 配置
hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 10000strategy: SEMAPHORE

这两种隔离策略的区别是

线程池隔离 信号量隔离
线程 与调用线程非相同线程 与调用线程相同(jetty线程)
开销 排队、调度、上下文开销等 无线程切换,开销低
异步 支持 不支持
并发支持 支持(最大线程池大小) 支持(最大信号量上限)

这样就可以正常地添加数据到购物车了。

查询购物车

查询购物车的功能很简单,前端携带着令牌向服务器发送请求,Controller调用相应的方法解析令牌拿到用户名,然后调用Service层从Redis中获取到对应的数据。

//	CartController
@GetMapping("/list")
public Result<List<OrderItem>> list() {String username = tokenDecodeUtil.getUserInfo().get("username");List<OrderItem> orderItems = cartService.list(username);return new Result<>(true,StatusCode.OK,"查询购物车成功",orderItems);
}
//--------------------------------------------------------------------------
//     CartServiceImpl
@Override
public List<OrderItem> list(String username) {return (List<OrderItem>) redisTemplate.boundHashOps("Cart_" + username).values();
}

权限控制

虽然购物车的功能已经实现了,但是还存在一个问题,就是没有对用户进行权限校验,我们可以去限制某个方法只能由拥有特定权限的用户去访问,要是不进行权限控制的话,任何人都可以访问就会很不安全。这里我准备对购物车用到的四个方法添加“USER”权限的控制。

首先为订单微服务和商品微服务添加OAuth2.0的依赖

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

然后将之前提取出来的public.key文件添加到这两个微服务的resources目录下。最后添加资源服务的配置类

@Configuration
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)//激活方法上的PreAuthorize注解
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {private static final String PUBLIC_KEY = "public.key";//公钥/**** 定义JwtTokenStore* @param jwtAccessTokenConverter* @return*/@Beanpublic TokenStore tokenStore(JwtAccessTokenConverter jwtAccessTokenConverter) {return new JwtTokenStore(jwtAccessTokenConverter);}/**** 定义JJwtAccessTokenConverter* @return*/@Beanpublic JwtAccessTokenConverter jwtAccessTokenConverter() {JwtAccessTokenConverter converter = new JwtAccessTokenConverter();converter.setVerifierKey(getPublicKey());return converter;}/*** 获取非对称加密公钥 Key* @return 公钥 Key*/private String getPublicKey() {Resource resource = new ClassPathResource(PUBLIC_KEY);try {InputStreamReader inputStreamReader = new InputStreamReader(resource.getInputStream());BufferedReader br = new BufferedReader(inputStreamReader);return br.lines().collect(Collectors.joining("\n"));} catch (IOException ioe) {return null;}}/**** Http安全配置,对每个到达系统的http请求链接进行校验* @param http* @throws Exception*/@Overridepublic void configure(HttpSecurity http) throws Exception {//所有请求必须认证通过http.authorizeRequests().anyRequest().permitAll();//.authenticated();    //其他地址需要认证授权}}

这里限制所有的请求都必须通过验证。然后我们在相应的方法上添加注解即可。

//  SkuController
@GetMapping("/{id}")
@PreAuthorize("hasAnyAuthority('USER')")
public Result<Sku> findById(@PathVariable Long id){//  SpuController
@GetMapping("/{id}")
@PreAuthorize("hasAnyAuthority('USER')")
public Result<Spu> findById(@PathVariable Long id){//  CartController
@GetMapping("/add")
@PreAuthorize("hasAnyAuthority('USER')")
public Result add(long id,int num) {@GetMapping("/list")
@PreAuthorize("hasAnyAuthority('USER')")
public Result<List<OrderItem>> list() {

这四个方法限制了只有拥有USER权限才可以访问,如果没有相应的权限请求就会被拒绝。

订单微服务对接网关

现在就差最后一步了,就是将订单微服务对接到网关,然后就可以通过网关将请求转发到订单微服务了。

在网关微服务的配置文件中添加订单微服务的路由配置

spring:cloud:routes:- id: changgou_order_routeuri: http://localhost:18089predicates:-Path=/api/cart/**,/api/categoryReport/**,/api/orderConfig/**,/api/order/**,/api/orderItem/**,/api/orderLog/**,/api/preferential/**,/api/returnCause/**,/api/returnOrder/**,/api/returnOrderItem/**filters:- StripPrefix=1

这样就OK了。

总结

原本的代码中,OAuth2.0是从内存中获取数据,文章的开头先是改了代码从数据库中获取数据。然后实现了购物车的功能并实现了权限控制。最后将订单微服务对接到了网关中,实现了通过网关去访问相应的微服务。

如果我的文章对你有些帮助,不要忘了点赞收藏转发关注。要是有什么好的意见欢迎在下方留言。让我们下期再见!

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

相关文章

  1. CTF-Web11(涉及SQL注入的绕过)

    11.加了料的报错注入先查看网页源代码,收集信息:分析:页面提示我们POSTusername与password两个参数,看了看源码,里面提示了我们sql语句$sql="select * from users where username=$username and password=$password"; 先随手post几个数试试,发现页面返回有四种…...

    2024/4/24 8:52:01
  2. VMware14.1.8 + Ubuntu 16.04.3 LTS 重新挂载共享文件夹

    在不同硬件平台移动虚拟机文件,经常出现共享文件无法挂载的情况,执行下面命令可以解决vmhgfs-fuse .host:/ /mnt/ -o nonempty -o allow_other...

    2024/4/12 3:06:29
  3. 面经分享:如何一招破解 Java 集合类面试题?

    Java集合类面试题: Java集合类绝对是我们的老朋友了,Java技术江湖里,谁人不知,谁人不晓,它的使用率非常高,使用难度却也不大,这也导致了很多人对它不屑一顾,殊不知其中却暗藏玄机,今天我们不妨一起来破解一下Java集合类的面试题。 面试官常用招式: 1.Java集合框架的基…...

    2024/4/25 21:09:34
  4. Life feelings--13--青春不毕业,那些心里念念叨叨难以忘怀的记忆

    --题记: 可期的未来和明天终将离我们愈来愈近尽管这段时间忙碌的接近一塌糊涂,但仍然很想写一篇毕业Blog,来记录自己那已经逝去的青葱岁月,以及沿途遇到的风景,所思,所感,所想;惟愿到已不再年轻时,翻到这些跨越多年的文字,带来的是一份温暖与希望。少年http://bd.kuw…...

    2024/4/29 4:52:11
  5. 受激发射损耗显微术(一)

    受激发射损耗显微术(一) 1、STED原理 在 STED 显微术中,有效荧光发光面积的减小是通过受激发射效应来实现的。一个典型的 STED 显微系统中需要两束照明光,其中一束为激发光,另外一束为损耗光。当激发光的照射使得其衍射斑范围内的荧光分子被激发,其中的电子跃迁到激发态后…...

    2024/5/3 1:14:09
  6. MYSQL数据库详解之DCL(mysql无密码破解密码等)和日志

    DCL一:主要用于授予或收回访问数据库的权限!权限级别主要有四个1. Global level :所有库,所有表的权限2. Database level:某个数据库中的所有权限3 .Table level:数据库中的某个表的权限4. Column level:表中的某个字段的权限二:MYSQL用户管理1:创建用户:CREATE …...

    2024/4/27 20:37:56
  7. 【慕课网架构师网课笔记】--属性资源文件与类映射

    1.在springboot项目的resources目录下新建file-upload-prod.properties ##路径 mac是/ windows是 \\ file.imageUserFaceLocation=/Users/wl/project/foodie-dev/images/foodie/faces2.在项目中新建类,引入配置类 @Component @ConfigurationProperties(prefix = "file&…...

    2024/4/26 5:09:48
  8. JAVA 线上故障排查完整套路,从 CPU、磁盘、内存、网络、GC

    CPU磁盘内存GC问题网络线上故障主要会包括cpu、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题的,基本上出问题就是df、free、top 三连,然后依次jstack…...

    2024/5/3 11:12:04
  9. 一个脚本把系统升级到https

    正文现在很多站长都会考虑将自己的站点从http升级到https,不仅是基于安全的考虑,有的也是因为第三方平台的限制,如谷歌浏览器会将http站点标记为不安全的站点,微信平台要求接入的微信小程序必须使用https等。那如何将一个http站点升级为https站点呢?http与https的区别为了…...

    2024/5/3 22:21:35
  10. 云IDE:Expo Snack:聚焦于React Native开发的WebIDE

    相较于其他的WebIDE,Expo Snack独树一帜,聚焦于React Native开发的WebIDE,相对也较有特点,通过这篇文章整理和总结一下。Expo定位与特性 Expo 自身定位为下一代iOS和Android的应用开发提供了免费、开源和完整的框架和工具,可以更快速的进行基于React Native的移动应用的开…...

    2024/4/29 14:51:23
  11. mysql空格问题引起查询问题

    小张是一名软件工程师,工作兢兢业业、一丝不苟且精益求精,天性乐观的他每天愉快地做着增删改查的工作,对于这些看似简单的CRUD,小张从来不会掉以轻心,他也笃定地坚信,自己向数据库里插入了什么数据,就能按条件把这些数据查询出来,毕竟,像MySQL这样的数据库,在全世界广…...

    2024/4/12 0:59:51
  12. 基于JAVA的RSA文件加密软件的设计与实现(源代码+论文)

    第1章 RSA应用现状及应用于文件加密的分析 1.1 RSA算法介绍与应用现状 RSA算法可以简单叙述如下: <密钥生成> 取素数p,q,令n=pq. 取与(p-1)(q-1)互素的整数e, 由方程de=1 (mod (p-1)(q-1))解出d, 二元组(e,n)作为公开密钥, 二元组(d,n)作为私有密钥. <加密解密…...

    2024/4/11 7:48:43
  13. promise用法

    promise用法使用背景promise初探then()函数catch()函数all()函数race()函数Promise.reject()函数Promise.resolve()函数 使用背景 这里只讲promise的如何使用,适用于什么情况下。不手撕源码,想看手撕源码请移步B站搜索promise。 假设我们现在有一串代码,用来判断现在…...

    2024/5/3 7:13:37
  14. 深度学习系列笔记——贰 (基于Tensorflow2 Keras迁移学习,使用预训练模型解决猫狗大战 四)

    深度学习系列笔记——贰 (基于Tensorflow Keras搭建的猫狗大战模型 一) 深度学习系列笔记——贰 (基于Tensorflow Keras搭建的猫狗大战模型 二) 深度学习系列笔记——贰 (基于Tensorflow2 Keras搭建的猫狗大战模型 三) 本篇博客是对于之前猫狗大战的补充,猫狗大战使用的…...

    2024/4/29 11:09:10
  15. RabbitMQ概述、快速入门

    0. 学习目标能够说出什么是消息中间件 能够安装RabbitMQ 能够编写RabbitMQ的入门程序 能够说出RabbitMQ的5种模式特征 能够使用Spring整合RabbitMQ1. 消息中间件概述 1.1. 什么是消息中间件 MQ全称为Message Queue,消息队列是应用程序和应用程序之间的通信方法。为什么使用MQ …...

    2024/4/23 23:41:27
  16. RabbitMQ概述、快速入门2

    0. 学习目标掌握RabbitMQ 高级特性理解RabbitMQ 应用问题能够搭建RabbitMQ 集群1. RabbitMQ 高级特性 1.1 消息可靠性投递 在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式。confirm…...

    2024/4/25 22:38:07
  17. 倍福控制器(Beckhoff Twincat 3)的ADS通讯相关知识及测试

    ADS简介YapethsDY 2020/08/27 PM基于ADS的twincat系统架构在Beckhoff TwinCAT 系统中,各个软件模块(如TwinCAT PLC、TwinCAT NC、Windows 应用程序等)的工作模式类似于硬件设备,它们能够独立工作,各个软件模块之间的信息交换通过TwinCAT ADS 而完成。因此各个ADS 设备之间…...

    2024/4/30 9:57:48
  18. Vue预习篇(五)Vue必会API

    1、数据相关API Vue.set 向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新。 使用方法:Vue.set(target, propertyName/index, value) 范例:批量设置商品价格 <template><!-- 添加批量价格更新 --><p><input v-model.number…...

    2024/4/17 21:09:12
  19. GNU Radio 基础代码分析

    文章目录后缀定义数据类型 来源:http://gnuradio.microembedded.com/tutorialswritepythonapplications1 #!/usr/bin/env python2 3 from gnuradio import gr4 from gnuradio import audio5 6 class my_top_block(gr.top_block):7 def +init+(self):8 gr.top_bloc…...

    2024/4/10 11:06:56
  20. 云计算基础:第十二章 Linux网络管理

    简介 Linux网络接口名称规则Network interface names Traditionally, network interfaces in Linux are enumerated as eth0, eth1, eth2, and so on. However, the mechanism which sets these names can cause changes to which interface gets which name as devices are ad…...

    2024/4/12 3:06:15

最新文章

  1. 利用大语言模型(KIMI)构建智能产品的控制信息模型

    数字化的核心是数字化建模&#xff0c;为一个事物构建数字模型是一项十分复杂的工作。不同的应用场景&#xff0c;对事物的关注重点的不同的。例如&#xff0c;对于一个智能传感器而言&#xff0c;从商业的角度看&#xff0c;产品的信息模型中应该包括产品的类型&#xff0c;名…...

    2024/5/3 22:42:58
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/3/20 10:50:27
  3. CSS3 高级- 复杂选择器、内容生成、变形(transform)、过渡(transition)、动画(animation)

    文章目录 一、复杂选择器兄弟选择器:选择平级元素的唯一办法属性选择器:1、通用:基本用不着,太泛了2、自定义:4种伪类选择器:1、目标伪类:2、结构伪类:3、元素状态伪类:4、伪元素选择器:应用于文字,使网页看起来想杂志5、否定伪类:选择器:not([本选择器的条件]) /*…...

    2024/5/3 10:26:16
  4. 基于物联网的智能家居远程视频监控系统设计与实现

    基于物联网的智能家居远程视频监控系统设计与实现 摘要&#xff1a;随着物联网技术的快速发展&#xff0c;智能家居系统已成为提升家居安全性和便利性的重要手段。本文设计并实现了一套基于物联网的智能家居远程视频监控系统&#xff0c;该系统结合了嵌入式技术、网络通信技术…...

    2024/5/2 22:19:57
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/3 11:50:27
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/2 16:04:58
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/2 23:55:17
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/3 16:00:51
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/5/3 11:10:49
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/3 21:22:01
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/2 9:47:30
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/2 23:47:43
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/3 13:26:06
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/3 1:55:15
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/2 9:47:28
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/3 16:23:03
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/3 1:55:09
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/2 8:37:00
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/3 14:57:24
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/2 9:47:25
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/2 23:47:16
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/3 22:03:11
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/3 7:43:42
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/3 1:54:59
  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