自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(272)
  • 资源 (2)
  • 收藏
  • 关注

原创 加载应用配置信息

private void loadApplicationConfiguration(CompositePropertySource compositePropertySource,String dataIdPrefix,NacosConfigProperties properties,Environment environment){ String fileExtension = properties.getFileExtension(); String nacosGroup = proper

2022-05-16 21:33:45 225

原创 通过轮寻实现配置信息实时的推送

class LongPollingRunnable implements Runnable{ private final int taskId; public LongPollingRunnable(int taskId){ this.taskId = taskId; } @Override public void run(){ List<CacheData> cacheDatas = new ArrayList<CacheData>()

2022-05-12 21:20:47 294

原创 给NacosConfig开启定时任务,定时检查配置信息

public class ClientWorker implements Closeable{ public ClientWorker(final HttpAgent agent,final ConfigFilterChainManager configFilterChainManager,final Properties properties){ //开启定时器,执行周期1s this.executor.scheduleWithFixedDelay(new Runnable(){

2022-05-10 20:45:21 322

原创 通过ThreadLocal维护线程封闭性

private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>(){ public Connection initialValue(){ return DriverManager.getConnection(DB_URL); }};public static Connection getConnection(){ return connecti

2022-04-17 15:39:41 155

原创 通过RestTemplate读取配置信息

初始化RestTemplate@Configurationpublic class OpenApiConfig{ @Bean public RestTemplate restTemplate(){ SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); requestFactory.setconnectTimeout(2000); requestFactor

2022-04-06 18:05:33 242

原创 用NacosConfigService从配置中心获取配置信息

1.导入NacosClient依赖包<dependency> <grpupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>1.3.1</version></dependency>2.用NacosConfigService从配置中心获取配置信息@Configurationpublic

2022-03-31 12:29:57 3119

原创 给NacosConfig开启定时任务,定时检查配置信息

public class ClientWorker implements Closeable{ public ClientWorker(final HttpAgent agent,final ConfigFilterChainManager configFilterChainManager,final Properties properties){ //开启定时器,执行周期为2s this.executor.scheduleWithFixedDelay(new Runnable(){

2022-03-30 14:47:02 670

原创 用文件存储Nacos元数据

@Componentpublic class RaftStore implements Closeable{ ... private final Properties meta = new Properties(); private static final String META_FILE_NAME= DATA_BASE_DIR+File.separator+"meta.properties"; private static final String CACHE_DIR = DATA_B

2022-03-29 17:13:55 692

原创 用缓存存储Nacos元数据

@Componentpublic class DataStore{ //内存缓存对象 private Map<String,Datum> dataMap = new ConcurrentHashMap<>(1024); public void put(String key,Datum value){ dataMap.put(key,value); } public Datum remove(String key){ return dataMa

2022-03-29 16:49:31 608

原创 NacosRule实现服务发现的负载均衡

初始化NacosRule@Configurationpublic class NacosRibbonRuleConfig{ @Bean public NacosRule nacosRule(){ return new NacosRule(); } @LoadBalanced @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } //配置全局负载均衡 @Co

2022-03-27 20:02:13 407

原创 分布式系统幂等性设计及其服务端和消费端代码实现JAVA

分布式Id获取@DubboService(version="1.0.0",group="distributed-uuid-server")public class DistributedServiceImpl implements DistributedService{ @Autowired private Snowflakeconfig snowflakeConfig; Map<String,SnowFlake> snowFlakeHandlerMap = new Concur

2022-03-25 22:49:12 748

原创 通过AOP切面和事件中心拦截服务注册

@Aspectpublic class DubboServiceRegistrartionEventPublishingAspect implements ApplicationEventPublisherAware{ //定义切面,拦截Spring cloud的ServiceRegistry接口的注册方法 public static final String REGISTER_POINTCUT_EXPRESSION = "execution(* org.springframework.cloud

2022-03-24 16:29:01 504

原创 NacosRegistration类维护Nacos元数据代码逻辑

public class NacosRegistration implements Registration,ServiceInstance{ ... @PostConstruct //读取开发人员在应用的配置文件中配置的元数据 Map<String,String> metadata = nacosDiscoveryProperties.getMetadata(); Environment env = context.getEnvironment(); Str

2022-03-24 15:16:34 787

原创 表名的动态替换mysql

添加配置类@Configuration@MapperScan("com.xxx.aaa.mapper")//对应的mapper文件目录路径public class MybatisPlusConfig{ @Resource private UserService userService; @Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){ MybatisPlusInterceptor interceptor

2022-03-23 14:50:48 1548

原创 spring-boot多数据源

1.配置多数据源的配置信息spring: datasource: dynamic: primary:master lazy:true strict:false datasource: url:jdbc:mysql://ip:port:dataname?.......代码实现1.引入依赖<dependency> <groupId>com.baomidou</groupId> <a

2022-03-22 17:27:35 603

原创 Mybatis-plus实现乐观锁

设计思路1.取出当前需要更新的记录,并获取当前版本好version2.在更新时候带上version3.执行更新时,sql中加入如下逻辑set version = new_version where version = old_version## 代码实现2.数据库实例表当中添加字段version2.添加mybatis全局配置```java@Configurationpublic class MybatisPlusOptLockerConfig{ @Bean public

2022-03-22 17:04:30 1010

原创 订单缓冲同步到订单中心代码实例

Map<RoundRobinTable.Table,Long> lastIdMap = Maps.newHashMap();Map<RoundRobinTable.Table,Object> lastOrderIdMap = Maps.newHashMap();while(running){ RoundTable.Table table.= roundRobinTable.nextTable(); //批量查询缓冲表 List<Map<String,Obj

2022-03-16 19:05:33 499

原创 JAVA的MQ双写示例

public OrderDto create(final OrderDto order) throws OrderException{ OrderDto createOrderDto = executeInShardingTrans((status)->{ OrderDto insertOrderDto = convert(orderService.insert(order)); return insertOrderDto;});//发MQorderMqProducer.publis

2022-03-16 18:13:36 578

原创 JAVA异步Web服务实现

public void submitFuture(final HttpServletRequest req,final Callable<CompletableFuture> task) throwsException{ final String uri = req.getRequestURI(); final Map<String,String[]> params = req.getParameterMap(); final AsyncContext asyncCont

2022-03-15 15:34:44 745

原创 异步编排CompletableFuture

场景一,并发调用,结果并集处理public static void test() throws Exception{ MyService service = new MyService(); CompletableFuture<String> future1 = sevice.getData("http://www.baidu.com"); CompletableFuture<String> future2 = service.getData("www.tx.com")

2022-03-14 21:00:30 513

原创 java的异步Callback任务

public class AsyncTest{ public static HttpAsyncClient httpAsyncClient; public static CompletableFuture<String> getHttpData(String url){ CompletableFuture asyncFuture = new completableFuture(); HttpAsyncRequestProducer producer = HttpAsync

2022-03-14 19:06:14 1042

原创 异步Future并行处理业务请求代码示例

线程池配合Future实现,但是阻塞主请求线程,高并发时依然会造成线程数过多,CPU上下文切换,通过Future可以并发发出N个请求,然后等待最慢的一个返回,总响应时间为最慢的一个请求返回的用时public class Test{ final static ExecutorService executor = Executors.newFixedThreadPool(2); public static void main(String[] args){ RpcService rpc

2022-03-14 18:17:55 493

原创 java线程池的类型和创建方式

1.单线程线程池ExecutorService executorService = Executors.newSingleThreadExecutor();//等价于return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1,1,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()))2.创建固定的线程池ExecutorS

2022-03-14 17:05:30 463

原创 验证数据库连接有效性Druid

public boolean validateObject(PooledObject<PoolableConnection> p){ try{ validateLifeTime(p); validateConnection(p.getObject()); return true; }catch(Exception e){ return false; }}private void validateLifetime(PooledObject<P

2022-03-13 15:22:46 1571

原创 缓存的崩溃与快速修复

取模对于取模机制,如果其中一个实例坏掉,摘除此实例将会导致大量的缓存不命中,则瞬间的大流量导致后端数据服务或后端服务出现问题,对于这种情况,可以采用主从机制来避免实例坏了的问题,其中一个实例坏了可以用从/主顶上来,但是取模机制下增加一个节点会导致大量缓存不命中,一般是建立另一个集群,然后把数据迁移到新集群,把流量迁移过去。一致性HASH对于一致性哈希,如果其中一个实例坏了,摘除此实例只影响一致性哈希上的部分缓存不命中,不会导致大量缓存瞬间回源到后端/数据库服务,但是会产生一定的影响快速恢复如果出现

2022-03-13 14:53:27 1064

原创 HttpClient当中的判断当前是否可以使用缓存代码实现

public boolean isServableFromCache(final HttpRequest request){ final String method = request.getRequestLine().getMethod(); final protocolVersion pv = request.getRequestLine().getProtocolVersion(); //如果请求不是HTTP1.1,不能走缓存 if(HttpVersion.HTTP_1_1.c

2022-03-12 19:16:41 359

原创 HttpClient客户端缓存

依赖<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient-cache</artifactId> <version>4.5.2</version></dependency>创建CacheConfig cacheConfig = CacheConfig.custom().setMaxCa

2022-03-12 01:09:38 607

原创 浏览器缓存中的ETag验证测试用例

@RequestMapping("/cache/etag")public ResponseEntity<String> cache(@RequestHeader(value="If-None-Match",required=false) String ifNoneMatch){ //浏览器验证文档内容的实体If-None-Match //当前系统时间 long now = System.currentTimeMillis(); long maxAge = 10; Strin

2022-03-11 19:51:33 332

原创 缓存应用的回写模式

异步写CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder().using( PooledExecutionServiceConfigurationBuilder.newPooledExecutionServiceConfigurationBuilder().pool("writeBehindPool",1,5).build())org.ehcache.Cache<String,String> my

2022-03-11 16:07:11 299

原创 java多级缓存API封装

本地缓存初始化public class LocalCacheInitService extends BaseService{ @Override public void afterPropertiesSet() throws Exception{ //商品类目缓存 Cache<String,Object> categoryCache = CacheBuilder.newBuilder().softValues() .maximumSize(100

2022-03-10 18:57:03 395

原创 EhCache 3.x实现

CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder() .using(PooledExecutionServiceConfigurationBuilder .newPooledExecutionServiceConfigurationBuilder() .defaultPool("default",1,10).build())//磁盘存储文件的位置 .with(new CacheManagerPer

2022-03-10 16:38:28 263

原创 缓存回收策略

1.基于空间基于空间指的是设置了存储空间,如设置10m,当达到存储空间上限时,按照一定的策略进行数据移除2.基于容量基于容量指缓存设置了最大大小,当缓存的条目超过最大大小时,按照一定的策略回收数据3.基于时间3.1TTL缓存的数据从开始到到期的一个时间段,不管在这个时间段内有没有被访问,缓存数据都将过期3.2TTI空闲期,即缓存数据多久没有被访问后移除4.回收算法FIFO 先进先出,先放入缓存的先被移除FRU 最近最少使用的数据,最先被移除LFU 最不常用算法,一定时间段内使用次数最

2022-03-10 16:17:53 219

原创 服务自动切换机房代码实现

public static String get(List<String> apis,Object[] args,String encoding,Header[] headers,Integer timeout){ String response = null; for(String api: apis){ String uri = UriComponentsBuilder.fromHttpUrl(api) .buildAndExpand(args).toUriStrin

2022-03-08 15:25:09 176

原创 使用Hystrix实现熔断

public boolean allowRequst{ //如果熔断开关强制打开,熔断降级处理 if(properties.circuitBreakerForceOpen().get()){ return false; } //如果熔断开关强制闭合,则正常处理 if(properties.circuitBreakerClosed().get()){ return ture; } //正常判读啊 return !isOpen() || allowSing

2022-03-07 18:48:51 729

原创 使用Hystrix实现服务降级

public class GetStockServiceCommand extends HystrixCommand<String>{ private StockService stockService; public GetStockServiceCommand(StockService stockService){ super(setter()); this.stockService = stockService; } private static Set

2022-03-07 18:03:20 208

原创 使用配置文件实现自动降级的开关配置

应用层API封装USER{ "用户信息", “user.not.call.backend”,//是否调用后端服务 “user.call.backend.rate.limit”,//调用后端服务的限流 “user.redis.expire.seconds”,//redis缓存过期时间}其中涉及几个配置1.user.not.call.backend是否回源到调用后端用户服务,如果不开启,那么访问缓存,不会将流量打入后端2.user.call.backend.rate.limit调

2022-03-07 16:45:11 461

原创 应用节流测试代码实现

Observable. .create(new Observable.OnSubscribe<Integer>(){ @Override public void call(Subscribe<? super Integer> subscribe){ //next实现 next(subscriber,1,0); next(subscriber,2,50); next(subscribe

2022-03-06 19:56:46 93

原创 分布式系统判断是否需要对接口限流的代码实现

public static acquire() throws Exception{ String luaScript.= Files.toString(new File("limit.lua"),Charset.defaultCharset()); Jedis jedis = new Jedis("192.168.147.52",6379); //获取当前秒数 String key = "ip:"+System.currentTimeMillis()/1000; String limit

2022-03-06 17:45:51 101

原创 限流某个街口的总兵发数或者请求数

1.限流某个接口的总兵发数try{ if(atomic.incrementAndGet() > 请求数){ //拒绝请求 } //执行请求}finally{ atomic.decrementAndGet();}2.限流某个接口的时间窗请求数LoadingCache<Long,AtomicLong> counter = CacheBuilder.newBuilder() .expireAfterWrite(2.TimeUnit.SECONDS) .

2022-03-05 21:48:39 161

原创 基于Servlet实现请求的隔离的代码实现

1.接受请求@RequestMapping("/book")public void getBook( HttpServletRequest request; @RequestParam(value="skuId") final Long skuId; @RequestParam(value="cat1") final Integer cat1; @RequestParam(value="cat2") final Integer cat2) throws Exception{ on

2022-03-04 18:18:06 2658

java8讲义与实战全篇

涵盖JAVA8全部知识点以及实战代码

2021-12-07

JavaGuide-main.zip

「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试

2021-12-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除