/** * Spring Cloud:提供了构建分布式系统所需的“全家桶”,比如服务发现、服务网关、服务路由、链路追踪等。** Eureka:(优瑞噶)*       服务治理:可以实现服务调用、负载均衡、容错等,实现服务发现与注册。*        服务注册与发现:Eureka采用了CS的设计架构,Eureka Server服务端作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用Eureka  Client客户端连接到Eureka Server服务端并维持心跳的连接。** Consul:Consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控)解决方案,它是一个一个分布式的,高度可用的系统,而且开发使用都很简便。*        它提供了一个功能齐全的控制平面,主要特点是:服务发现、健康检查、键值存储、安全服务通信、多数据中心。** Ribbon:*      是一个基于HTTP和CP的客户端负载均衡工具,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。** Feign:*     是一个声明式WebService客户端,旨在使编写Java Http客户端变得更容易。*     使用方法是定义一个服务接口然后在上面添加注解,以前是Dao接口上面标准Mapper注解,现在是一个微服务接口上面标注一个Feign注解即。*        FFeign集成了Ribbon,利用Ribbon维护了Payment的服务列表信息,并且通过轮询实现了客户端的负载均衡,而与Ribbon不同的是,通过Feign只需要定义服务绑定接口且一声明式的方法,优雅而简单的实现了服务调用。** Hystrix:*        ystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等。*     Hystrix能保证在一个依赖出问题的情况下,不会导致整个服务失败,避免出现级联故障,以提高分布式系统的弹性。*       “断路器”本身是一种开发装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理*         的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。*       Hystrix三大作用:*            服务降级(Fallback):比如当服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好提示,Fallback,会发生降级的几种情况:程序运行异常、超时、服务熔断触发服务降级。*          服务熔断(Break):类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示。三个步骤先进行服务的降级、进而熔断、恢复调用链路。*          实时的监控:会持续地记录所有通过Hystrix发起的请求执行信息,并以统计报表和图形的形式展示给用户,包括没秒执行多少成功,多少失败等。** Gateway:*     旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。*        目标是替代ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。*        作为一个 API 架构,用来保护、增强和控制对于 API 服务的访问。API 网关是一个处于应用程序或服务(提供 REST API 接口服务)之前的系统,用来管理授权、访问控制和流量限制等,这样 REST API 接口服务就被 *          API 网关保护起来,对所有的调用者透明。因此,隐藏在 API 网关后面的业务系统就可以专注于创建和管理服务,而不用去处理这些策略性的基础设施。*      最重要的几个概念:*           Route(路由):这是网关的基本构建块,它由一个ID,一个URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。*            Predicate(断言):输入类类是一个ServerWebExchange。我们可以使用它来匹配来自HTTP请求的任何内容,例如headers。如果请求与断言相匹配则进行路由。*          Filter(过滤器):Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者后对请求进行修改。** =================总结经验=======================*     Eureka 服务端作为服务注册中心,需要声明 @EnableEurekaServer*        其他的服务作为单独的服务需要注册在Eureka的注册中心,需要声明 @EnableEurekaClient*      OrderFeign作为负载均衡器,不需要作为Eureka的客户端,只需要激活Feign @EnableFeignClients只需要在接口上添加 @FeignClient(name="mcroservice-payment")//使用Feign,使用哪个微服务*      Hystrix作为断路器,不需要作为Eureka的客户端,只需要激活Hystrix @EnableHystrixDashboard*           在控制类上添加 @DefaultProperties(defaultFallback = "paymentTimeOutFallbackMethod")*           然后再接口上添加 @FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentFallbackService.class)*       GateWay作为网关,需要作为Eureka客户端*           通过application配置文件配置,*                 spring:*                 cloud:*                     gateway:*                     discovery:*                       locator:*                         enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名称j进行路由*                       routes:*                          - id: payment_route # 路由的id,没有规定规则但要求唯一,建议配合服务名*                         #匹配后提供服务的路由地址*                           #uri: http://localhost:8001*                            uri: lb://MCROSERVICE-PAYMENT*                          predicates:*                              - Path=/payment/get/** # 断言,路径相匹配的进行路由*                             #- After=2020-11-20T14:17:43.912+08:00[Asia/Shanghai] #断言在当前时间之后才可以访问*                        - id: payment_route2*                         #uri: http://localhost:8001*                            uri: lb://MCROSERVICE-PAYMENT*                          predicates:*                              Path=/payment/lb/** #断言,路径相匹配的进行路由*          或者通过代码实现*               @Bean*             public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){*                   RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();*                    routes.route("patn_route_buba",r -> r.path("/guonei").uri("http://news.baidu.com/guonei")).build();*                   return routes.build();*             }*      **** Ribbon本地负载均衡与Nginx服务端负载均衡的区别?*  Nginx是服务器的负载均衡,客户端所有的请求都会交给Nginx,然后由Nginx实现转发请求,即负载均衡是由服务端实现的。*    Ribbon本地负载均衡,在调用服务接口的时候,会在注册中心上获取注册信息服务列表之后缓冲到JVM本地,从而在本地实现RPC远程服务调用技术。** LB负载均衡分为哪两种?*    集中式LB,即在服务的消费方和提供方之间是有独立的LB设施(可以是硬件,如F5,也可以是软件,如Nginx),由该设施负责把访问请求通过某种策略转发至服务的提供方。*    进程内LB,将LB逻辑集成于消费方,消费方从注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个 合适的服务器。Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程。**//* * mcroservice:总项目名*//* cloud-api-commons */创建一个实体类和返回数据类型/* cloud-provide-payment */服务生产者:POM文件:表示自己是eureka客户端<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>application文件:eureka:client:#表示是否将自己注册进eureka  默认为trueregister-with-eureka: true#是否从EurekaServer中抓取已有的注册信息,默认为true,单点无所谓,集群必须设置true才能和ribbon使用负载均衡fetch-registry: trueservice-url:#defaultZone: http://localhost:7001/eureka    #单机配置defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka   #集群配置启动类上增加注解:@EnableEurekaClient//===================================================Eureka实现服务发现://注入服务发现的注解@Autowiredprivate DiscoveryClient discoveryClient;在启动类上加上注解@EnableDiscoveryClient/* cloud-consumer-order */服务消费者:使用@Configuration创建一个配置类注入到IOC容器中,创建一个使用RestTemplate访问远程http服务的方法,配合@Bean加载到容器中,方法上加@LoadBalanced表示开启负载均衡POM文件:表示自己是eureka客户端<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>application文件:eureka:client:#表示是否将自己注册进eureka  默认为trueregister-with-eureka: true#是否从EurekaServer中抓取已有的注册信息,默认为true,单点无所谓,集群必须设置true才能和ribbon使用负载均衡fetch-registry: trueservice-url:#defaultZone: http://localhost:7001/eureka   #单机配置defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka   #集群配置启动类上增加注解:@EnableEurekaClient控制类Controller中的地址:单机配置:地址写死指定生产者服务器,http://localhost:8001集群配置:地址写生产服务器在Eureka的注册名,http://MCROSERVICE-PAYMENT负载均衡:使用集群访问的时候必须在RestTemplate配置类上增加@LoadBalanced注解,表示开启负载均衡。//===========================================================//更改负载算法,由我们的轮询算方法换为随机算法,需要自定义一个配置类,注意:这个自定义类不能放在@ComponentScan所扫描的当前包下以及包下,否则我们自定义的这个配置类会被所有的Ribbon客户端所共享,达不到特殊化定制的目的了。新建MyselfRule配置类:   @Beanpublic IRule myRule() {return new RoundRobinRule();// 定义为随机}  在主启动类上加@RibbonClient注解@RibbonClient(name = "mcroservice-payment",configuration = MyselfRule.class)//name为生产者服务的服务名称  configuration为配置类的类名/* cloud-eureka-server */Eureka服务端:POM文件:表示自己是eureka服务端<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>application文件:server:port: 7001eureka:instance:hostname: eureka7001.com #eureka服务端的实例名称client:register-with-eureka: false     #false表示不向注册中心注册自己。fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务service-url:#设置与eureka  server交互的地址和注册服务都需要依赖这个地址defaultZone: http://eureka7002.com:7002/eureka/   #集群就是指向其他的eureka#defaultZone: http://eureka7001.com:7001/eureka/  #单机就是指向自己启动类上增加注解:@EnableEurekaServer/* cloud-eureka-server02 */Eureka服务端:Eureka集群是需要修改映射配置的,我们找到C:\Windows\System32\drivers\etc路径下的hosts文件,在文件的最后加上我们两个Eureka的映射127.0.0.1 eureka7001.com127.0.0.1 eureka7002.comapplication文件:server:port: 7002eureka:instance:hostname: eureka7002.com #eureka服务端的实例名称client:register-with-eureka: false     #false表示不向注册中心注册自己。fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务service-url:#设置与eureka  server交互的地址和注册服务都需要依赖这个地址defaultZone: http://eureka7001.com:7001/eureka/  #集群就是指向其他的eureka启动类上增加注解:@EnableEurekaServer/* cloud-provide-payment02 */服务生产者:application文件:eureka:client:#表示是否将自己注册进eureka  默认为trueregister-with-eureka: true#是否从EurekaServer中抓取已有的注册信息,默认为true,单点无所谓,集群必须设置true才能和ribbon使用负载均衡fetch-registry: trueservice-url:#集群配置defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eurekainstance:#服务名称修改instance-id: payment8002#访问路径可以显示ip地址prefer-ip-address: true/* cloud-consumer-feign-order */Openfeign实现负载均衡:POM文件:<!--openfeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--eureka client--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>applcation文件:server:port: 80#eureka集群eureka:client:register-with-eureka: falsefetch-registry: trueservice-url:defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka启动类:增加注解 @EnableFeignClients//激活Feign的注解  需要加到主启动类上生产者服务接口上增加注解 @FeignClient(value ="mcroservice-payment")//使用Feign// =====总结一下Openfeign就是微服务调用接口+@FeignClient注解===== Openfeign实现超时控制:application文件:# 设置feign客户端超时时间(OpenFeign默认支持ribbon)ribbon:# 指的是建立连接所用的时间,适用于网络状态正常的情况下,两端连接所用的时间,设置等待5000为5秒时间,Fegin超时默认1秒ReadTimeout: 5000# 指的是建立连接后从服务器读取到可用资源所用的时间ConnectTimeout: 5000Openfeign实现日志打印:application文件:logging:level:# feign日志以什么级别监控哪个接口com.buba.springcloud.service.PaymentService: debug新建配置类:@Beanpublic Logger.Level feignLoggerLevel() {// 请求和响应的头信息,请求和响应的正文及元数据return Logger.Level.FULL;}/* cloud-provider-hystrix-payment8001 */生产者断路器:POM文件:<!--hystrix--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency><!--eureka client--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>application文件:server:port: 8001spring:application:name: cloud-provider-hystrix-paymenteureka:client:register-with-eureka: truefetch-registry: trueservice-url:   defaultZone: http://eureka7001.com:7001/eureka启动类:@EnableEurekaClient// ==================================生产者服务降级配置:服务超时的降级,熔断:在需要降级的方法上增加注解 @HystrixCommand进行配置,一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法。@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHabdler",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")} )//fallbackMethod属性是写降级(另一个兜底的方法)的方法名,意思就是该方法出现问题后, 这个方法paymentInfo_TimeOutHabdler进行兜底。//commandProperties属性是数组形式的,可以设置多个属性,添加该注解@HystrixProperty,然后配置里边name和value的属性。name属性就是该线程timeoutInMilliseconds,value就是设置峰值时间启动类增加 @EnableCircuitBreaker //表示激活业务类上加的@HystrixCommand注解运行异常的服务降级:在需要降级的方法上增加注解 @HystrixCommand@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHabdler",commandProperties = {@HystrixProperty(name = "circuitBreaker.enabled",value = "true"),// 是否开启断路器@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),// 请求次数@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), // 时间窗口期@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),// 失败率达到多少后跳闸} )/* cloud-consumer-feign-hystrix-order */消费者断路器:POM文件:server:port: 80eureka:client:register-with-eureka: truefetch-registry: trueservice-url:defaultZone: http://eureka7001.com:7001/eurekaapplication文件:<dependency><groupId>com.netflix.hystrix</groupId><artifactId>hystrix-javanica</artifactId><version>1.5.18</version><scope>compile</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>启动类:@SpringBootApplication@EnableEurekaClient@EnableFeignClients新建业务类:类名上增加注解 @FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT")//=================================================消费者服务降级,熔断:POM文件:<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>application文件:feign:hystrix:enabled: true启动类:@EnableCircuitBreaker //回路,表示激活业务类上加的@HystrixCommand注解在Controller业务类的方法上加注解 @HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod", commandProperties = {@HystrixProperty(name = "circuitBreaker.enabled",value = "true"),// 是否开启断路器@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),// 请求次数@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), // 时间窗口期@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),// 失败率达到多少后跳闸})//fallbackMethod属性是写降级(另一个兜底的方法)的方法名,意思就是该方法出现问题后, 这个方法paymentInfo_TimeOutHabdler进行兜底。//commandProperties属性是数组形式的,可以设置多个属性,添加该注解@HystrixProperty,然后配置里边name和value的属性。name属性就是该线程timeoutInMilliseconds,value就是设置峰值时间/* 代码膨胀问题 */在消费者服务的的业务类Controller中一个全局的服务降级的兜底的方法 payment_Global_FallbackMethod()在控制类的类名上增加注解 @DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")然后在需要服务降级的方法上加上注解 @HystrixCommand//默认的fallback注解 /* cloud-gateway-gateway9527 */API网关:POM文件://采坑提示,不要引入web依赖,不然会报错,项目都起不来。<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>       application文件:server:port: 9527spring:application:name: cloud-gatewaycloud:gateway:discovery:locator:enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名称j进行路由routes:- id: payment_route # 路由的id,没有规定规则但要求唯一,建议配合服务名#匹配后提供服务的路由地址uri: http://MCROSERVICE-PAYMENTpredicates:# 断言,路径相匹配的进行路由- Path=/payment/get/** - id: payment_route2uri: http://MCROSERVICE-PAYMENTpredicates:#断言,路径相匹配的进行路由Path=/payment/lb/** eureka:instance:hostname: cloud-gateway-serviceclient:fetch-registry: trueregister-with-eureka: trueservice-url:defaultZone: http://eureka7001.com:7001/eureka/启动类:@EnableEurekaClient//=============================================还有一种配置方案就是通过硬编码的方式新建一个config配置文件类/*** 配置了一个id为routr-name的路由规则* 当访问地址http://localhost:9527/guonei时会自动转发到http://news.baidu.com/guonei* */@Configurationpublic class GateWayConfig{@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();routes.route("patn_route_buba",r -> r.path("/guonei").uri("http://news.baidu.com/guonei")).build();return routes.build();}}Filter:自义定过滤器:过滤器类主要就是实现实现这两个接口GlobalFilter, Ordered,然后实现具体的业务逻辑public class MyLogGatewatFilter implements GlobalFilter, Ordered {//你要访问我时候需要一个指定的用户名才能进行访问,@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("************come in MyLogGatewatFilter "+ new Date());//判断是否携带uname的keyString uname = exchange.getRequest().getQueryParams().getFirst("uname");//非法用户请离开if(uname==null){log.info("************用户名为null,非法用户");exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);return exchange.getResponse().setComplete();}//合法用户进行下一个过滤链进行过滤验证return chain.filter(exchange);}//这个0数字代表加载过滤器的顺序,就是越小优先级越高,因为是全局的,所以必须是第一位的。@Overridepublic int getOrder() {return 0;}}

参考:https://blog.csdn.net/weixin_38007185/article/details/108186254

SpringCloud项目实战整理及详细代码相关推荐

  1. 逻辑回归三部曲——逻辑回归项目实战(信贷数据+Python代码实现)

         逻辑回归已经在各大银行和公司都实际运用于业务,已经有很多前辈写过逻辑回归.本文将从我实际应用的角度阐述逻辑回归的由来,致力于让逻辑回归变得清晰.易懂.逻辑回归又叫对数几率回归,是一种广义线性 ...

  2. Android组件化与插件化开发项目实战整理分享(含支付宝、360、美团、滴滴等大厂项目实战)

    小公司不说,但是在大公司的项目发展到一定程度,就必须进行模块的拆分.模块化是一种指导理念,其核心思想就是分而治之.降低耦合.而在 Android 开发的实践,目前有两种途径来实现,一个是组件化,一个是 ...

  3. 【手把手】ios苹果打包——遇见项目实战|超详细的教程分享

    六年代码两茫茫,不思量,自难忘 6年资深前端主管一枚,只分享技术干货,项目实战经验 关注博主不迷路~ 文章目录 前言 weex介绍 eeui介绍 一.安装CocoaPods 1.CocoaPods介绍 ...

  4. JQuery极果商城项目实战(附完整代码)

    JQuery极果商城前端页面 效果图 技术点 HTML页面结构 CSS reset.css common.css index.css JavaScript JQuery json 效果图 技术点 本次 ...

  5. 原 !神静态网页布局详解,html+css布局实战,附详细代码

    代码整体效果展示 1页面布局思路 本次界面的布局主要采用定位流的方式来进行布局.因为界面具有很多透视效果,以及背景图片的重叠.接下来我将详细讲解布局 第一层定位流: 素材: 此图片作为总体背景应该放在 ...

  6. Redis高级项目实战,16条代码规范建议

    前几天逛知乎的时候看到一个话题:MySQL没前途了吗? 最近几年,似乎总有一种声音在说,MySQL可能不太行了,原因无非是这么几条,MySQL功能不如PG强大,原生没有分库分表不如TIDB,OLAP性 ...

  7. 微服务springCloud 项目实战 创建数据库表规约及建表语句

    # 创建数据库表规约及建表语句 1.建表规约 **[强制]**表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是tinyint(1) ( 1表示是,0表示否). 说明:任何字段如果为非负 ...

  8. 微信小程序项目实战之天气预报

    概述 微信小程序项目实战之天气预报 详细 代码下载:http://www.demodashi.com/demo/10634.html 一.准备工作 1.注册微信小程序 2.注册和风天气账号 3.注册百 ...

  9. React-后台管理系统项目实战

    React-后台管理系统项目实战视频地址 github代码地址 React 入门实例教程 Redux 入门教程(一):基本用法 Redux 入门教程(二):中间件与异步操作 Redux 入门教程(三) ...

最新文章

  1. 一个多年网络工程师总结的工作实用经验
  2. Linux的文件权限
  3. Solr配置与简单Demo[转]
  4. 最强通用编译器优化工具!MIT三篇顶会论文打造,准确率是传统方法5倍
  5. android 返回图标,在Toolbar中添加一个返回图标
  6. JupyterNotebook配置远程登录
  7. x86 32位oracle,X86 32位和64位的区别
  8. JanusGraph组件对应版本
  9. 查看宽带虚拟拨号PPPoE的上网口令密码
  10. 丧心病狂的Github技巧
  11. 你有多久没有看过星星
  12. Pixel3 支持中国电信2G语音、4G网络、VOLTE
  13. 新房和二手房税费比较
  14. linux c python,Python 不是 C
  15. 记疫情无聊时对老师答题网站的一次渗透(1)
  16. R语言ggplot2可视化气泡图(bubble plot)、将可视化图像的图例(lengend)放置在图像底部、图例水平方向排布(horizontal direction)、图例标题在图例标签顶部
  17. Java 知识结构图
  18. 前端面试题【背完最低10k】
  19. GitHub里的灭霸脚本,竟都还不是最奇葩的?
  20. Tc3.0/Tc2.0使用方法

热门文章

  1. plsql 删除一直在执行_固态硬盘开启Trim后,删除数据究竟能不能恢复?
  2. 跟着iMeta学做图|ComplexHeatmap包绘制热图展示不同样本物种相对丰度
  3. 屌丝站长如何购买虚拟主机?
  4. Zero-shot knowledge distillation in deep networks
  5. Android 10.0 SystemUI下拉状态栏UI定制化开发系列(一)
  6. 字符串转换为驼峰格式
  7. 福昕阅读器中,如何令两个pdf文件分别在两个不同的窗口显示?
  8. JAVASE温故知新
  9. DRAMA QUEEN_洪晃在ilook的BLOG
  10. Quad Industries、Agfa等公司合作推出塑料12位RFID标签和带有丝印印刷电路的读出