2110-微服务核心知识点及问题分析

常见问题分析


  • 什么是配置中心?(存储项目配置信息的一个服务,这个服务可以实现配置的动态发布和更新)

  • 为什么要使用配置中心?(集中管理配置信息,动态发布配置信息,服务自动感知配置)

  • 市场上有哪些主流的配置中心?(Apollo,nacos,……)

  • 配置中心一般都会配置什么内容?(可能会经常变化的配置信息,例如连接池,日志、线程池、限流熔断规则)

  • 什么信息一般不会写到配置中心?(服务端口,服务名,服务的注册地址,配置中心地址)

  • 项目中为什么要定义bootstrap.yml文件?(此文件被读取的优先级比较高,可以在服务启动时读取配置中心的数据)

  • Nacos配置中心宕机了,我们的服务还可以读取到配置信息吗?(可以从服务的本地内存读取)

  • 微服务应用中客户端如何感知配置中心数据变化?(1.4.x版本的nacos客户端会基于长轮询机制从nacos获取配置信息)

  • 服务启动后没有从配置中心获取我们的配置数据是什么原因?(依赖,bootstrap.yml,配置单词,格式,配置模型)

  • 你项目中使用的日志规范是什么?(SLF4J~门面模式)

  • 你了解项目中的日志级别吗?(debug,info,warn,error可以基于日志级别控制日志的输出)

  • Nacos配置管理模型的背景?(环境不同配置不同)

  • Nacos配置中的管理模型是怎样的?(namespace>group>service/data-id)

  • Nacos客户端(微服务)是否可以读取共享配置?(可以)

常见Bug分析


  • mysql中没有配置中心数据,例如:

在这里插入图片描述

  • 包导入错误,例如:

在这里插入图片描述

  • 配置中心配置格式不正确,例如:

在这里插入图片描述

  • 程序中服务读取配置时,找不到配置,例如:

在这里插入图片描述

课后作业


  • 总结课上知识点

  • 完成文档中的共享配置应用.

  • 预习06-sentinel限流熔断操作实践。

  • 尝试设计并完成一个本地cache的应用(拓展-CopyOnWriteArrayList)。

在ProviderCacheController,进行本地缓存设计应用,例如:

private CopyOnWriteArrayList cache=new CopyOnWriteArrayList<>();

@GetMapping(“/provider/cache02”)

public List doUseLocalCache02(){

if(!useLocalCache){//假如useLocalCache的值为false,表示不开启本地cache.

log.info(“select data from database”);

return Arrays.asList(“A”,“B”,“C”);//假设这些数据来自数据库

}

if(cache.isEmpty()){

synchronized (this) {

if (cache.isEmpty()) {

//模拟从数据库获取数据

log.info(“select data from database”);

List data = Arrays.asList(“A”, “B”, “C”);

//将数据放入cache中

cache.addAll(data);

}

}

}

log.info(“select data from cache”);

return cache;

}

Day05-Sentinel 限流应用实践

===============================================================================

核心知识点


  • 服务限流、降级的背景(服务的治理)

  • Sentinel限流入门实践(控制台8180-定义规则,客户端服务应用规则:依赖,配置)

  • Sentinel常用限流模式(直接->当前url,关联->保证核心业务,链路->红绿灯)

  • @SentinelResource注解作用及限流异常处理(AOP设计)

  • Sentinel默认异常限流处理类(DefaultBlockExceptionHandler)

常见问题分析


  • 为什么要进行限流、降级? (系统处理能力有限,可以通过限流方式,保证系统可靠运行,以退为进)

  • 你了解Sentinel限流有哪些算法? (计数器,令牌桶,漏桶,滑动窗口算法~sentinel默认)

  • Sentinel常用限流模式?(直接,关联->保证核心业务,链路->红绿灯)

  • @SentinelResource注解的作用,你用过哪些属性?(在链路限流中描述资源节点,切入点方法)

  • Sentinel常用限流效果有哪些?(快速失败,预热,排队)

  • Sentinel中限流被触发时出现的异常类型是什么?(都是BlockException类型的子类)

  • 如何对限流结果进行处理?(有默认处理方案-DefaultBlockExceptionHandler,也可以自定义.)

  • Sentinel限流的基本原理?(底层对服务请求进行拦截,然后通过流控规则限定对资源访问)

在这里插入图片描述

常见Bug分析


  • sentinel 服务启动不起来?(要配置jdk环境变量path,要使用JDK8版本)

  • sentinel 面板不显示我们的服务?(依赖,配置>一定要注意缩进,先访问,放大招-清idea缓存重启)

  • 配置完sentinel后,业务服务启动不了了?(大部分都是配置错了)

课后作业


  • 总结课上知识点.

  • 了解常用限流算法.

  • 预习并尝试完成Sentinel服务降级,热点规则设计,系统规则设置,授权规则设置.

  • 预习07~spring cloud gateway网关。

  • 基于spring mvc 拦截器对系统中指定资源进行时间访问限制?

第一步:拦截器原理分析(回顾spring mvc中的拦截器),例如:

在这里插入图片描述

第二步:自定义拦截器,例如:

package com.jt.provider.interceptor;

public class TimeInterceptor implements HandlerInterceptor {

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

throws Exception {

System.out.println(“preHandle”);

//1.获取当前时间

LocalTime now = LocalTime.now();//LocalTime为jdk8中的一个获取当前时间的api

//2.获取当前的小时并进行逻辑判断

int hour = now.getHour();//8:10~8

System.out.println(“hour=”+hour);

if(hour<9||hour>18){

throw new RuntimeException(“请在9~18时间范围内访问”);//return false

}

return true;//false请求到此结束,true表示放行,会去执行后续的拦截器或controller对象

}

}

第三步:配置拦截器,例如:

package com.jt;

@Configuration

public class SpringWebConfig implements WebMvcConfigurer {

/**

  • 注册拦截器(添加到spring容器),并指定拦截规则

  • @param registry

*/

@Override

public void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(new TimeInterceptor())

.addPathPatterns(“/provider/sentinel01”);

}

}

第四步:打开浏览器,对/provider/sentinel01路径进行访问,对访问结果进行访问。

Day06-Sentinel 进阶应用实践

===============================================================================

核心知识点


  • Sentinel降级(熔断)入门实现(出现不稳当的系统服务时,暂停对此服务的访问)

  • Sentinel实现热点参数限流(热点视频,文章,…)

  • Sentinel系统规则配置(例如cpu使用率,QPS,…),

  • Sentinel授权规则配置(黑白名单,黑白设计由业务决定)

常见问题分析


  • 如何理解熔断?(可以理解为暂时关闭不稳定的服务,要学会舍得)

  • 如何自定义熔断异常处理规则?(实现BlockExceptionHandler接口)

  • 如何理解热点参数?(频繁访问的数据,系统底层如何判定哪些数据是频繁访问-lru)

  • 系统规则是全局规则吗,常见规则有哪些? (是,响应时间-RT,QPS,CPU,线程数)

  • 授权规则需要我们自己写请求解析类吗?(需要,实现RequestOriginParser接口)

常见Bug分析


  • 请求参数单词错误。

课后作业


  • 总结课上知识点。

  • 了解Lru算法解决了什么问题?

  • 总结几个Sentinel中用到设计模式?

  • 预习API网关Gateway限流实现(07-网关应用实践)。

Day07-Gateway 应用实践

============================================================================

核心知识点


  • API 网关(Gateway)诞生背景

  • 市场主流微服务网关(Spring Cloud Gateway,zuul,…)

  • API Gateway实现服务的保护和转发(重点)

  • API Gateway层面的负载均衡实现(重点,lb://sca-provider)

  • API Gateway请求处理原理分析(重点:官方图,了解关键代码,执行过程)

  • API Gateway中常用谓词(predicate)对象及实践。

常见问题分析


  • 为什么要使用api网关?(服务保护,统一url访问,统一身份认证,统一跨域设计,。。。)

  • 网关入门实践的步骤? (依赖,配置,启动,服务访问)

  • 网关项目中的负载均衡是如何实现?(底层基于Ribbon实现,可以在RibbonLoadBalancerClient中加断点分析)

  • 说说SpringCloud gateway处理请求的基本流程?(官方,断点)

  • 网关中的谓词对象类型?(GatewayPredicate)

  • 网关中的谓词对象是如何创建的?(谓词工厂)

  • 你在网关中配置过哪些常用谓词?(Path,Method,Before,Query,Header,…)

常见BUG分析


  • 配置文件格式不正确,例如

在这里插入图片描述

  • 服务访问被拒绝,例如

在这里插入图片描述

  • 服务注册失败(nacos没启动),例如:

在这里插入图片描述

  • 503 异常(找不到可用的服务)

在这里插入图片描述

课后作业


  • 总结课上知识点

  • 练习基于Gateway实现负载均衡方式的配置。

  • 练习常用谓词(Predicate)应用。

  • 预习并尝试完成网关中的过滤器以及sentinel限流设计。

Day08-Gateway 应用进阶实践

==============================================================================

核心知识点


  • API Gateway中过滤器(Filter)的类型及实践。

  • API Gateway中基于sentinel实现服务限流(API,路由id)。

  • API Gateway中基于自定义限流结果的处理(GatewayCallbackManager)。

常见问题分析


  • 网关中的过滤器是如何分类的?(GlobalFilter,GatewayFilter:需要手动配置)

  • 我们是否可以自定义谓词,过滤器对象?(可以,参考官方默认的定义)

  • 网关层面如何基于sentinel实现限流?(有关sentinel的两个依赖,配置,JVM参数)

  • 网关层面的限流类型有哪些?(路由id,API分组)

  • 我们是否可以对限流结果进行自定义处理?(可以)

课堂练习


  • 网关中设置黑白名单?

第一步:在配置文件添加如下配置,例如:

web:

request: # 注意假如属性名是两个单词,要用"-"进行连接,例如black-urls

black-urls: # 系统底层解析这部分时,会自动以"-"作为分隔符,将内容存储到list集合

  • /nacos/provider/echo/a

  • /nacos/provider/echo/b

第二步:在项目中添加一个全局过滤器,例如:

package com.jt.filter;

import org.apache.http.HttpHeaders;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;

import org.springframework.cloud.gateway.filter.GlobalFilter;

import org.springframework.core.Ordered;

import org.springframework.core.io.buffer.DataBuffer;

import org.springframework.http.HttpStatus;

import org.springframework.http.server.reactive.ServerHttpRequest;

import org.springframework.http.server.reactive.ServerHttpResponse;

import org.springframework.web.server.ServerWebExchange;

import reactor.core.publisher.Mono;

import java.util.ArrayList;

import java.util.List;

/**

  • 基于此全局过滤器对请求url进行黑白名单识别

  • @ConfigurationProperties 注解描述类时,用于告诉系统底层

  • 要从配置文件中读取指定配置信息(prefix属性用于指定读取哪部分

  • 前缀对应的信息)

*/

@ConfigurationProperties(prefix = “web.request”)

@Component

public class BlackUrlGlobalFilter implements GlobalFilter, Ordered {//Authentication(认证)

private List blackUrls=new ArrayList<>();

/**

  • 当系统底层读取@ConfigurationProperties(prefix = “web.request”)

  • 注解中描述的内容时,会自动基于名字调用此set方法

*/

public void setBlackUrls(List blacks) {

this.blackUrls = blacks;

}

/**

  • 此方法为一个处理请求的方法

  • @param exchange 基于此对象获取请求和响应

  • @param chain 过滤链对象

  • @return SpringWebFlux中的Mono对象(一个Publisher对象),

  • 是springframework5.0后推出的新特性,

*/

@Override

public Mono filter(ServerWebExchange exchange,

GatewayFilterChain chain) {

//1.获取请求和响应对象

ServerHttpRequest request = exchange.getRequest();

ServerHttpResponse response = exchange.getResponse();

//2.获取请求url

String urlPath=request.getURI().getPath();//nacos/provider/echo/gateway

System.out.println(“blackPath=”+blackUrls);

System.out.println(“urlPath=”+urlPath);

//3.对请求url进行黑白名单分析

//黑名单则请求到此结束

if(blackUrls.contains(urlPath)){

//设置响应状态码

response.setStatusCode(HttpStatus.UNAUTHORIZED);//401

//设置请求头中响应数据内容类型

response.getHeaders()

.add(HttpHeaders.CONTENT_TYPE,“text/html;charset=utf-8”);

//构建一个数据buffer对象

DataBuffer dataBuffer=

response.bufferFactory()

.wrap(“请求url是黑名单”.getBytes());

//将数据封装到Mono对象

return response.writeWith(Mono.just(dataBuffer));

}

//白名单则放行(执行下一步,假如有下个过滤器,就执行下一个过滤器)

return chain.filter(exchange);

}

@Override

public int getOrder() {

return -1;

}

}

  • 自定网关层面的限流异常处理对象?

package com.jt.callback;

import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;

import com.alibaba.fastjson.JSON;

import org.springframework.http.HttpStatus;

import org.springframework.http.MediaType;

import org.springframework.stereotype.Component;

import org.springframework.web.reactive.function.server.ServerResponse;

import org.springframework.web.server.ServerWebExchange;

import reactor.core.publisher.Mono;

import java.util.HashMap;

import java.util.Map;

@Component

public class GatewayRequestBlockHandler implements BlockRequestHandler {

@Override

public Mono handleRequest(

ServerWebExchange serverWebExchange,

Throwable throwable) {

Map<String,Object> map=new HashMap<>();

map.put(“state”,429);

map.put(“message”,“two many request”);

String jsonStr= JSON.toJSONString(map);

// return ServerResponse.ok()

// .body(Mono.just(jsonStr), String.class);

return ServerResponse.status(HttpStatus.TOO_MANY_REQUESTS)

.contentType(MediaType.TEXT_PLAIN)

.body(Mono.just(jsonStr), String.class);

}

}

课后作业


  • 总结课上知识点

  • 完成黑白单全局过滤器的设计

  • 完成网关层面基于路由ID和API分组方式的限流

  • 完成网关层面自定义限流异常的处理.

  • 微服务架构下ajax请求响应处理实践。

第一步:业务描述(通过sca-ui工程向网关工程发送ajax请求,并进行响应处理)

在这里插入图片描述

第二步:创建sca-ui工程的html页面,然后通过触发按钮发送ajax请求,例如

Title

The Index Page

Buy

第三步:在sca-gateway的配置文件或配置中心中添加跨域配置,例如:

spring:

cloud:

gateway:

globalcors: #跨域配置

cors-configurations:

‘[/**]’:

allowedOrigins: “*”

allowedMethods: “*”

第五步:按项目架构设计启动服务,进行测试。

http://localhost:8080/index.html

  • 将路由配置写到配置中心进行实践?(自己动手丰衣足食)

第一步:在sca-gateway项目中添加配置依赖,例如:

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-config

第二步:修改application.yml配置文件名称为bootstrap.yml,并添加配置中心配置。

spring:

cloud:

nacos:

config:

server-addr: localhost:8848

file-extension: yml

第三步:在nacos的public命名空间中创建sca-gateway.yml配置,内容如下:

在这里插入图片描述

说明,此配置添加后,可以将bootstrap.yml中网关部分的配置注释掉。

第四步:启动nacos,sentinel,provider,gateway服务,然后进行访问测试。

Day09~单点登录系统初步设计及实现

=============================================================================

核心知识点


  • 单点登录系统诞生的背景。

  • Java中单点登录系统解决方案。

  • 单点登录系统(SSO)中的服务划分及关系设计。

  • 单点登录系统中父工程的创建及初始化。

  • 系统基础服务(sso-system)工程的创建及初始化

  • 系统基础服务(sso-system)工程中pojo对象设计及实现

常见问题分析


  • 为什么要做单点登录设计?(业务简化,代码复用,不需要每个服务都登录一次)

  • 你知道哪些SSO系统解决方案?(基于用户登录状态信息的存储进行方案设计)

  • 单点登录系统中你的服务是如何设计的,工程结构是怎样的?

  • 项目中使用的连接池什么?(HikariCP)

  • Java中连接池设计需要遵循的数据源规范是谁?(javax.sql.DataSource)

  • 连接池这块你能想到的设计模式有哪些?(单例,享元,桥接,slf4j门面)

  • 如何排除springboot工程中junit4依赖?

在这里插入图片描述

  • SpringBoot工程中如何基于junit4的单元测试?

在这里插入图片描述

  • SpringBoot工程中如何基于Junit5进行单元测试?

在这里插入图片描述

  • SpringBoot单元测试类应该写在哪个位置?

在这里插入图片描述

  • 基于idea的为类自动生成序列化id?

第一步:修改idea中的配置。

在这里插入图片描述

第二步:在User类上按alt+enter,例如:

在这里插入图片描述

  • @Autowired注解描述的Mapper对象有红色波浪线,但运行没有错误,如何去除红色波浪线。

在这里插入图片描述

常见Bug分析


  • MySql指令不可用,例如:

在这里插入图片描述

  • 单元测试类位置写错了,例如:

在这里插入图片描述

  • 单元测试类定义的位置不正确,例如

在这里插入图片描述

  • Springboot工程中中存在多个启动类,例如

在这里插入图片描述

  • DataSource包导入错误,例如:

在这里插入图片描述

  • 单元测试方法不能有参数,例如:

在这里插入图片描述

  • 单元测试方法的返回值类型只能是void,例如:

在这里插入图片描述

  • Junit4单元测试方法,其访问修饰符必须为public,例如

在这里插入图片描述

  • 连接数据库的url中时区定义有问题,例如:

在这里插入图片描述

  • NullPointerExeption 异常分析?

在这里插入图片描述

  • 数据库依赖问题,例如:

在这里插入图片描述

课后作业


  • 总结课上内容

  • 完成单点登录系统中的基础服务的设计和实现

Day10~SSO系统中的登录逻辑基本实现

===============================================================================

核心知识点


  • 系统服务中(sso-system)中定义数据访问逻辑对象(UserMapper)

  • 系统服务中(sso-system)中定义业务逻辑接口及实现类对象(UserService,UserServiceImpl)

  • 系统服务中(sso-system)中定义控制逻辑对象(UserController)

  • 创建认证服务(sso-auth)并进行初始化(添加依赖,定义配置,编写启动类,执行默认登录)

  • 认证服务(sso-auth)中创建User对象用于封装从远程system服务中获取的用户信息

  • 认证服务中定义远程访问Feign接口(RemoteUserService~基于此接口调用sso-system服务中的用户信息)

  • 基于Security规范定义用户业务逻辑服务对象(UserDetailsServiceImpl~调用RemoteUserService获取和封装用户信息)

  • 定义用户认证基本配置类(SecurityConfig~配置密码加密对象,提供认证管理器对象)

  • 实现自定义登录逻辑测试(校验登录正确账号和错误账户下服务端的响应结果)

  • 熟悉SpringSecurity的认证流程?(Client->Filters->AuthenticationManager–>UserDetailService->…)

常见问题分析


  • UserMapper接口如何交给Spring管理(@Mapper,@MapperScan)

  • 用户业务逻辑对象中你是如何开启事务的?(@Transactional)

  • @Transactional中的readOnly属性默认值是什么?(false,这个值一般应用在非只读事务上)

  • 用户业务逻辑对象中如何开启本地缓存?(@EnableCaching用于开启缓存,@Cacheable用于定义切入点方法)

  • 系统服务(system)工程中事务开启,缓存应用都是基于什么设计思想实现的?(AOP)

  • SpringBoot工程中默认的AOP代理对象是基于什么方式创建的?(CGLIB)

  • 为什么定义RemoteUserService 接口(Feign)?(基于此接口调用远程sso-system服务)

  • sso-auth服务中用户业务数据的获取在哪里?(客户端提交的用户名,sso-system服务提供的数据库数据)

  • 为什么要构建SecurityConfig对象?(配置加密算法,提供认证管理器对象)

  • 为什么要让SecurityConfig类要继承WebSecurityConfigurerAdapter类型?(重写默认的认证规则)

  • 认证过程中使用的密码加密对象是谁?(BCryptPasswordEncoder,不可逆加密对象)

  • 用户登录时,需要从数据库查询哪些信息?(用户信息以及用户的权限信息)

  • 如何基于用户id查询用户权限,你有什么方案?(3种)

在这里插入图片描述

  • 单体架构中的用户的状态的存储是如何实现的?(了解,默认是存储到了tomcat的session对象中)

在这里插入图片描述

常见Bug分析


  • 没有PasswordEncoder对象,例如:

在这里插入图片描述

  • 远程调用服务404异常,例如:

在这里插入图片描述

  • 远程调用服务没启动或服务名不正确,例如

在这里插入图片描述

  • 服务名的定义和使用不规范,例如:

在这里插入图片描述

  • Feign接口依赖注入异常,例如:

在这里插入图片描述

  • NullPointerException,例如

在这里插入图片描述

课上小技巧


  • Maven Helper 插件安装及应用,例如

在这里插入图片描述

在这里插入图片描述

课后作业


自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们

目录:

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

Java面试核心知识点

已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0f845357a6572931551681f94c563428.png)

在这里插入图片描述

课后作业


自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-n4QZNKPi-1711952861188)]

[外链图片转存中…(img-bEMJx8lx-1711952861189)]

[外链图片转存中…(img-yW5sZgkZ-1711952861189)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们

目录:

[外链图片转存中…(img-8WiVkSBG-1711952861190)]

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

[外链图片转存中…(img-0yaQ2NWK-1711952861190)]

Java面试核心知识点

已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了

[外链图片转存中…(img-TyFLQb8J-1711952861191)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值