spring cloud oauth2的使用
1、创建一个父项目
依赖不选
创建好后会只有有一个pom.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.6</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>cn.butcher</groupId><artifactId>springcloudoauth2</artifactId><version>0.0.1-SNAPSHOT</version><name>springcloudoauth2</name><description>springcloudoauth2 project</description><properties><java.version>11</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
我们需要修改一下版本号,因为我是以我当前的项目作为背景的,我的项目使用了alibaba的2.2.6版本。
所以将pom修改为:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.2.RELEASE</version><relativePath/></parent><groupId>cn.butcher</groupId><artifactId>springcloudoauth2</artifactId><version>0.0.1-SNAPSHOT</version><name>springcloudoauth2</name><description>springcloudoauth2 project</description><!-- 打包方式为pom--><packaging>pom</packaging><properties><java.version>11</java.version><spring.boot>2.3.2.RELEASE</spring.boot><spring.cloud>Hoxton.SR9</spring.cloud></properties><dependencies><!-- 因为基本上后面子模块都需要用到web,所以直接在父里面引--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 单元测试 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-test</artifactId></dependency></dependencies><dependencyManagement><dependencies><!--管理springcloud依赖,后续子模块就不用写版本号了--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring.cloud}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement></project>
2、使用maven创建认证服务器
创建一个认证服务器authentication-service
创建包和主启动类
package cn.butcher;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @author 谭熙* @version 1.0* @date 2021/10/30 9:51* @description*/
@SpringBootApplication
public class AuthenticationApplication {public static void main(String[] args) {SpringApplication.run(AuthenticationApplication.class,args);}
}
创建配置文件application.yml
配置端口
server:port: 8001
在这个认证模块的pom.xml中加入oauth2的依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springcloudoauth2</artifactId><groupId>cn.butcher</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>authentication-service</artifactId><dependencies><!--oauth2依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-oauth2</artifactId></dependency></dependencies></project>
PS:如果maven爆红了,刷新也没用,请清楚idea缓存并重启idea尝试
3、编写认证配置
接下来就是编写认证有关的了,因为这是由spring实现的一套oauth2,是基于spring security的
按住ctrl+鼠标左键点进去,其实会发现这里有很多自动配置,管理了很多依赖
第一层,发现是security和oauth2的整合
点击security进入第二层
再继续点
到这思考,可不可以直接使用spring security实现的oauth2捏,后面我们在尝试,这里稍微埋点坑。
创建auth包,这个包下全部是关于认证配置的
所以根据spring security的习惯,我们需要先编写一个自己UserDetails,将来的用户信息全部封装到这里面。
package cn.butcher.auth;import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;import java.util.Collection;
import java.util.stream.Collectors;
import java.util.stream.Stream;/*** @author 谭熙* @version 1.0* @date 2021/10/30 10:30* @description*/
public class MyUserDetail implements UserDetails {private String username;private String password;private String perms;public MyUserDetail() {}public MyUserDetail(String username, String password, String perms) {this.username = username;this.password = password;this.perms = perms;}// 获取权限集合,这里我们自己定义权限编写的规则,通过逗号分隔权限@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {return Stream.of(perms.split(",")).map(SimpleGrantedAuthority::new).collect(Collectors.toList());}// 获取密码,返回当前密码@Overridepublic String getPassword() {return this.password;}// 获取用户名,返回当前用户名@Overridepublic String getUsername() {return this.username;}// 账户是否没过期@Overridepublic boolean isAccountNonExpired() {return true;}// 账户是否未锁定@Overridepublic boolean isAccountNonLocked() {return true;}// 凭证是否没过期@Overridepublic boolean isCredentialsNonExpired() {return true;}// 是否启用此用户@Overridepublic boolean isEnabled() {return true;}
}
配置security,配置密码加密器,后面会用到。放行登录,如果登录都不放行,那怎么认证?
package cn.butcher.auth;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;/*** @author 谭熙* @version 1.0* @date 2021/10/30 10:45* @description*/
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {// 密码加密,security所有的密码都需要经过此加密器加密才能使用@Beanpublic PasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}// 认证管理器@Bean@Overrideprotected AuthenticationManager authenticationManager() throws Exception {return super.authenticationManager();}// http请求相关配置@Overrideprotected void configure(HttpSecurity http) throws Exception {// 关闭csrfhttp.csrf().disable()// 认证所有请求,将所有请求放行,因为我们使用oauth2进行认证的.authorizeRequests().anyRequest().permitAll()// 允许表单登录便于用户填写认证信息.and().formLogin()// 允许登出.and().logout();}
}
配置用户认证服务,在security接收到用户的登录信息时,会自动调用这里的方法进行验证,这个验证的逻辑需要我们自己实现。
package cn.butcher.auth;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;/*** @author 谭熙* @version 1.0* @date 2021/10/30 10:53* @description*/
@Service
public class MyUserDetailService implements UserDetailsService {// 这是在SecurityConfig中配置的密码加密,这里自动导入@Autowiredprivate PasswordEncoder passwordEncoder;// security在获取到用户名后会自动调用这个方法进行认证,我们只需要实现逻辑@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {// 如果登录的用户是butcher 或者 tanxi ,// 就说明用户存在,并返回此用户详细信息,否则返回null// 这里的用户信息还可以更多if (username.equals("butcher") || username.equals("tanxi")){return new MyUserDetail(username,passwordEncoder.encode(username),"sys:read,sys:write");}return null;}
}
总要有个地方存放token,所以需要配置token存储的位置,这里可以选择将token放在内存、数据库、redis等地方。。
package cn.butcher.auth;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.InMemoryTokenStore;/*** @author 谭熙* @version 1.0* @date 2021/10/30 11:04* @description*/
@Configuration
public class TokenConfig {@Beanpublic TokenStore tokenStore(){// 这里还可以配置很多token存储的地方// JdbcTokenStore、JwtTokenStore、RedisTokenStore...// 我这里就直接放在内存中了,不过需要注意的是,当上线用户量激增的时候,放在内存中可能会出大事情return new InMemoryTokenStore();}
}
既然用到了oauth2,那肯定要进行oauth2的配置,比如设置token的存活时间,刷新token的存活时间等
package cn.butcher.auth;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
import org.springframework.security.oauth2.provider.ClientDetailsService;
import org.springframework.security.oauth2.provider.code.InMemoryAuthorizationCodeServices;
import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices;
import org.springframework.security.oauth2.provider.token.DefaultTokenServices;
import org.springframework.security.oauth2.provider.token.TokenStore;/*** @author 谭熙* @version 1.0* @date 2021/10/30 11:09* @description*/
@Configuration
@EnableAuthorizationServer
public class Oauth2Config extends AuthorizationServerConfigurerAdapter {@AutowiredPasswordEncoder passwordEncoder;// 配置客户端认证@Overridepublic void configure(ClientDetailsServiceConfigurer clients) throws Exception {// 去内存里找已认证的客户端clients.inMemory()// 客户端id ==> AppID.withClient("bt-client-1")// 客户端密码 ==> AppSecret.secret(passwordEncoder.encode("bt123"))// 允许这个客户端访问的资源为sale-resources,这个等配置资源服务器的时候会用到.resourceIds("sale-resources")// 授权类型,四大种嘛 依次为授权码、密码、客户端、简单。// 最后那个是刷新token,在token即将过期的时候刷新token拿到新的token.authorizedGrantTypes("authorization_code", "password", "client_credentials", "implicit", "refresh_token")// 作用域范围,这也是我们自定的,将我们的应用划分作用域范围,确保这个客户端只能请求固定范围内的资源.scopes("sale")// 是否自动统一授权,设置为false,就是需要用户点击同意或者不同意.autoApprove(true)// 用户同意后跳转的地址是,这个地址后面会携带一个code,这个code,用来换取token.redirectUris("http://www.baidu.com");// 还可以继续and()配置其他客户端}@AutowiredTokenStore tokenStore;@Autowiredprivate ClientDetailsService clientDetailsService;// 配置token认证服务@Beanpublic AuthorizationServerTokenServices tokenServices(){// DefaultTokenServices是AuthorizationServerTokenServices的一个默认实现类DefaultTokenServices defaultTokenServices = new DefaultTokenServices();// 设置客户端认证服务,就和我们前面写的MyUserDetailService的作用差不多// 帮我们拿得到的客户端id去验证密码// 这个认证服务有两个实现类,一个是基于内存的,一个是基于jdbc的// 当我们需要去数据库中拿到客户端密码比较,就可以用jdbc的defaultTokenServices.setClientDetailsService(clientDetailsService);// 是否支持刷新tokendefaultTokenServices.setSupportRefreshToken(true);// 设置token要存储的位置defaultTokenServices.setTokenStore(tokenStore);// 设置token的有效存活时间defaultTokenServices.setAccessTokenValiditySeconds(300);// 设置刷新token的有效存活时间defaultTokenServices.setRefreshTokenValiditySeconds(1500);return defaultTokenServices;}// 在security中配置的认证管理器@AutowiredAuthenticationManager authenticationManager;// 将认证管理器、认证码服务、token服务组合@Overridepublic void configure(AuthorizationServerEndpointsConfigurer endpoints){// 认证管理器endpoints.authenticationManager(authenticationManager)// 认证码服务.authorizationCodeServices(new InMemoryAuthorizationCodeServices())// token服务.tokenServices(tokenServices())// 允许请求token的方式.allowedTokenEndpointRequestMethods(HttpMethod.POST);}// 放行与认证有关的接口,如果认证的接口都不放,那么何谈认证@Overridepublic void configure(AuthorizationServerSecurityConfigurer security) throws Exception {security.tokenKeyAccess("permitAll()").checkTokenAccess("permitAll()")// 允许表单认证客户端.allowFormAuthenticationForClients();}
}
如果都按照上面配置了,那么就可以进行测试了,一般都是用postman测嘛,我们先不管拿到token后如何获取其他服务的资源,我们先要拿到token,检查token是否有效,刷新token,这里没问题了,咱们再继续
4、测试
启动认证服务
1、授权码模式
打卡浏览器请求:http://localhost:8001/oauth/authorize?client_id=bt-client-1&response_type=code&scope=sale&redirect_uri=http://www.baidu.com
注意这里有四个参数:
- client_id ==》 客户端id,就是在Oauth2Config那你配置的客户端id
- response_type==》响应类型,我们期望能给咱返回一个授权码,用于请求真正的token
- scope ==》 作用域,同样是Oauth2Config里定好的,验证客户端想要请求的作用域我们有没有给它设置
- redirect_uri ==》 重定向的地址,注意这里也是你在Oauth2Config写好的,这个不匹配也不行,重定向后会携带一个参数code就是授权码
第一次会要求登录,用户名密码就是你在MyUserDetailService那里配置的。
登录成功后:
拿到授权码,打开postman
发送post请求:http://localhost:8001/oauth/token
携带以下5个参数
- client_id
- client_secret 这里是Oauth2Config那里配置的这个客户端的密匙
- grant_type
- code 将授权码加在此处
- redirect_uri
响应结果
{"access_token": "bc492e36-eb02-4bc2-9619-e66041da6acd","token_type": "bearer","refresh_token": "8a38b119-a0d1-4cdb-a844-797ecd5e0af9","expires_in": 299,"scope": "sale"
}
- access_token 认证的token,请求资源的时候将这个带上即可
- token_type token的类型
- refresh_token 可以通过它刷新token,拿到新的token,原来的会失效
- expires_in 在几秒后过期
- scope 作用域
既然可以获取token那么我们测试一下这个token是否可用。
使用postman请求:http://localhost:8001/oauth/check_token
,带上参数token以及它的值
在我打字的这段时间,上次请求的token已经过期了,我们刷新一下token
使用postman请求:http://localhost:8001/oauth/token
并带上四个参数
- client_id
- client_secret
- grant_type 注意这里的类型是refresh_token
- refresh_token
拿到了新的token,再去检查token
token在有效期内,咱么成功拿到了用户信息
{"aud": ["sale-resources"],"user_name": "butcher","scope": ["sale"],"active": true,"exp": 1635575837,"authorities": ["sys:read","sys:write"],"client_id": "bt-client-1"
}
5、编写一个资源
创建一个新的子模块sale-service
作为我们众多服务中的一个服务,依然使用maven创建即可。
创建配置文件,修改端口
server:port: 8002
创建包和启动类
package cn.butcher;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @author 谭熙* @version 1.0* @date 2021/10/30 14:50* @description*/
@SpringBootApplication
public class SaleApplication {public static void main(String[] args) {SpringApplication.run(SaleApplication.class,args);}
}
创建一个controller
package cn.butcher.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;/*** @author 谭熙* @version 1.0* @date 2021/10/30 14:52* @description*/
@RestController
public class SaleController {@GetMapping("/order")public Map<String,Object> getOrder(){Map<String,Object> data = new HashMap<>();data.put("status",200);data.put("msg","获取订单信息成功");data.put("data",new String[]{"我是订单信息1","我是订单信息2"});return data;}
}
启动服务,尝试请求/order
接口
请求成功,接下来将它配置为资源
引入oauth2依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springcloudoauth2</artifactId><groupId>cn.butcher</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>sale-service</artifactId><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-oauth2</artifactId></dependency></dependencies>
</project>
编写配置,创建auth包
首先是security的配置
package cn.butcher.auth;import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;/*** @author 谭熙* @version 1.0* @date 2021/10/30 15:01* @description 主要是放行所有请求,因为我们是需要oauth2来认证了*/
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable().authorizeRequests().anyRequest().permitAll();}
}
配置为资源服务器
package cn.butcher.auth;import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;
import org.springframework.security.oauth2.provider.token.RemoteTokenServices;/*** @author 谭熙* @version 1.0* @date 2021/10/30 15:03* @description*/
@Configuration
@EnableResourceServer
public class Oauth2Config extends ResourceServerConfigurerAdapter {@Overridepublic void configure(ResourceServerSecurityConfigurer resources) {// 请求认证服务器认证,但这么做并不好,请求多了以后,认证服务器压力山大RemoteTokenServices tokenServices = new RemoteTokenServices();// 设置请求的地址tokenServices.setCheckTokenEndpointUrl("http://localhost:8001/oauth/check_token");// 设置客户端idtokenServices.setClientId("bt-client-1");// 设置客户端密码tokenServices.setClientSecret("bt123");// 设置资源名字,注意这个资源名字和认证服务器中的Oauth2Config那配置的资源名称是对应的resources.resourceId("sale-resources").tokenServices(tokenServices);}@Overridepublic void configure(HttpSecurity http) throws Exception {// 检查是否有正确的作用域http.csrf().disable().authorizeRequests().antMatchers("/**").access("#oauth2.hasScope('sale')");}
}
OK,我们再次请求这个/order
接口
这时就提示未授权了,因为我们没有token
我们需要在请求头中加入token信息
注意格式为:Authorization=token类型+空格+token
6、小结
这只是一个简单的演示,真正使用我们应该是在数据库获取redis中存储token信息,并且资源服务器去确认token的时候应该不用每次都去认证服务器请求才是,所以还在继续改进中。
找个时间填一下上面提到的一个坑,就是
也就是说,这种用法要过期了,在下一版本中会将security从springcloud中移除。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- HTML + CSS 面试题常见知识点
offsetWidth (内容宽度 内边距 边距),无外边距margin 纵向重叠 相邻元素的 margin-top 和 margin-bottom 会发生重叠空白内容也会重叠 margin 负值问题 margin-top 和 margin-left 负值,元素向上、向左移动margin-right 负值&a…...
2024/5/2 22:23:36 - pod概述:概念、原理深度解读
Pod概述:概念、原理深度解读 1.1 带你梳理Pod概念、原理 什么是Pod? Pod是Kubernetes中的最小调度单元,一个Pod封装一个容器(也可以封装多个容器),Pod里的容器共享存储、网络等。也就是说,可…...
2024/5/2 19:30:15 - 线性代数笔记3.2线性先关定理
定理1 定理二(非常重要) 唯一性证明 在数学中,证明唯一性的一个常见套路是,假设不唯一,然后导出矛盾 替换定理 替换定理,要替换的向量个数必须大于等于原来向量的个数 在实际做题的时,更常用它的逆否命题 推论一 …...
2024/5/5 16:19:05 - java文件字节输出流
java.io.OutputStream void close() 关闭此输出流并释放与此流有关的所有系统资源。 void flush() 刷新此输出流并强制写出所有缓冲的输出字节。 void write(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流。 void write(byte[] b, int off, int len) 将指定 byt…...
2024/5/2 22:23:28 - C++ 2.0 几个新特性
Variadic Templates 数量不定的模板参数 void print() {}; template<typename T, typename...Types> void print(const T& firstArg, const Types&...args) {cout << firstArg << endl;print(args...); }void main() {print(7.5, "hello"…...
2024/5/2 22:23:23 - 【1054】三角形判断
1054:三角形判断 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 58291 通过数: 33175 【题目描述】 给定三个正整数,分别表示三条线段的长度,判断这三条线段能否构成一个三角形。如果能构成三角形,则输出“yes”&am…...
2024/5/2 22:23:19 - 2021-2027中国光学设计与仿真软件市场调研报告
辰宇信息咨询市场调研公司最近发布-《2021-2027中国光学设计与仿真软件市场调研报告》 内容摘要 本文研究中国市场光学设计与仿真软件调研报告,侧重分析在中国市场扮演重要角色的企业,重点呈现这些企业在中国市场的光学设计与仿真软件收入、市场份额、…...
2024/5/2 22:23:15 - Anaconda及jupyter出现的各种问题
前言 国庆的末尾,班里的一名大佬在班群里发了一个比赛链接,说是找队友,我好奇问了一下,数据分析?没学过,只学了点python;然后大佬就找我聊,最后拉我进队了,然后我长达20多…...
2024/5/2 22:23:11 - SpringCloud微服务实战——搭建企业级开发框架(九):使用Nacos发现、配置和管理微服务
Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 1、跟之前新建SpringBoot自定义…...
2024/5/2 22:23:11 - 企业运维实战--k8s学习笔记.k8s容器资源限制 Metrics-Server部署 图形化监控Dashboard部署 K9S的安装
1.kubernetes容器资源限制 Kubernetes采用request和limit两种限制类型来对资源进行分配。 request(资源需求):即运行Pod的节点必须满足运行Pod的最基本需求才能运行Pod。 limit(资源限额):即运行Pod期间,可能内存使用量会增加,那…...
2024/5/2 22:23:04 - 如何理解deepMind 团队的Muzero算法
如何理解deepMind 团队的Muzero算法 Muzero算法是什么? Muzero建立在alphaZero算法的搜索能力以及基于搜索的策略迭代算法之上,同时联合了一个学习model在训练的过程中,极大的扩展了该学习算法的应用场景。 它主要是将mentor Calor Tree Se…...
2024/5/2 22:22:59 - 搜索框 筛选列表中的相关
//拆分搜索框内容,筛选列表中的相关社区 void SearchCommunities(string searchContent) { string[] keyWords searchContent.Split(’ ); int index 1; foreach (Transform child in communityRowsParent) { child.gameObject.SetActive(false); for (int i 0; …...
2024/5/2 22:22:55 - 第二章:数据类型,运算符,和表达式。
1.1:C语言的数据类型。数据类型:基本类型(整型,字符型,实型),构造类型(机构体类型,公用体类型,枚举类型),指针类型,空类型。 1.2:C语…...
2024/5/2 22:22:52 - SQLServer连接Pgsql读写数据
问题 想把SQLServer的数据库迁移到PgSql里面,因为两个数据库业务表的结构和字段都不一样,需要逐表进行按需抽取想要的字段并导入数据。 解决方案 可以在SqlServer里面创建链接服务器,链接到Pgsql的表,然后在SQLServer中把数据写…...
2024/5/2 22:22:47 - 2021-2027中国度假租赁管理软件市场调研报告
辰宇信息咨询市场调研公司最近发布-《2021-2027中国度假租赁管理软件市场调研报告》 内容摘要 本文研究中国市场度假租赁管理软件调研报告,侧重分析在中国市场扮演重要角色的企业,重点呈现这些企业在中国市场的度假租赁管理软件收入、市场份额、市场定…...
2024/5/2 22:22:43 - 成功安装CUDA 10.0 和Cudnn 7.4.1
from Bubbliiiing 网盘下载: 链接: https://pan.baidu.com/s/1znYSRDtLNFLufAuItOeoyQ 提取码: 8ggr 下载完之后得到这两个文件。 安装CUDA 打开exe文件进行安装。 选择自定义。 重复点击下一步。安装完后,在C:\Program Files\NVIDIA GPU Computing…...
2024/5/2 22:22:40 - 设计模式 - Bridge 桥模式
Bridge桥模式也属于”的单一职责“模式中的典型模式。 问题描述: 我们绘制图形时,图形可以有不同形状以及不同颜色,比如圆形可以是红的,绿的,方形可以是红的绿的,如果用代码来描绘这些类,会有如…...
2024/5/2 22:22:36 - MySQL设计规约
建表规约 解决数据库相关名称的纠结选择合适的数据类型和长度表、字段命名 必须使用小写字母或数字 禁止出现数字开头 禁止两个下划线中间只出现数字 不使用复数名词 禁用保留字 是与否概念的字段,必须使用is_xx的方式命名(一般使用tinyint&#x…...
2024/5/2 22:22:31 - JS学习总结(一)
JS是弱类型语言,边解释边执行 JS引用方式:内嵌;外联;事件 JS输出方式: alert(提示窗)不识别标签,会阻塞程序conlose.log(控制台输出)不识别标签,方便调试document.write(页面文档输出) 识别标…...
2024/5/2 22:22:27 - keep-alive的运用
只有被keep-alive包围的组件才有 activated和 deactivated两个属性。 效果图 app.vue home.vue 参考 vue中keepAlive组件的作用及使用方式...
2024/5/2 22:22:23
最新文章
- 车载诊断技术 --- Service 22读取DID怎么会导致ECU不在线
车载诊断技术 — Service 22读取DID怎么会导致ECU不在线 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非…...
2024/5/5 22:29:43 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - Redis之缓存穿透、击穿、雪崩
一、缓存穿透 缓存穿透是指在使用缓存系统时,特定的查询在缓存和数据库中都找不到结果,导致每次查询都要访问数据库,从而增加数据库的压力,降低系统的性能,若黑客利用此漏洞进行攻击可能压垮数据库。 当一个查询请求经…...
2024/5/4 2:50:43 - ICMP协议和Tracert工作原理
ICMP协议 使用基于 ICMP 协议来实现的命令 ping,traceroute 来判断网络是否连通。 ICMP是 Internet Control Message Protocol 的缩写,即互联网控制消息协议。它用于 TCP/IP 网络中发送控制消息,提供可能发生在通信环境中的各种问题反馈&am…...
2024/5/2 14:23:38 - 解决GNU Radio+USRP实现OFDM收发在接收端QPSK星座图映射无“抖动”问题
文章目录 前言一、遇到的问题二、解决方案三、重新编译安装四、验证五、资源自取 前言 本文记录在 GNU RadioUSRP 实现 OFDM 收发时,在接收端 QPSK 星座图映射无“抖动”问题的解决方法, 一、遇到的问题 我遇到的问题是,现在搭建的 OFDM 模…...
2024/5/3 13:25:32 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/4 23:54:56 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/4 23:54:56 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/5/4 23:54:56 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/4 23:55:17 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/5/4 23:54:56 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/5/4 23:55:05 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/5/4 23:54:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/5/4 23:55:16 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/5/4 23:54:56 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/4 18:20:48 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/5/4 23:54:56 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/5/4 23:55:17 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/4 23:55:06 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/4 23:55:06 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/5 8:13:33 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/4 23:55:16 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/4 23:55:01 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/4 23:54:56 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) 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 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在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