- 博客(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
313
原创 通过轮寻实现配置信息实时的推送
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
501
原创 给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
409
原创 通过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
231
原创 通过RestTemplate读取配置信息
初始化RestTemplate@Configurationpublic class OpenApiConfig{ @Bean public RestTemplate restTemplate(){ SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); requestFactory.setconnectTimeout(2000); requestFactor
2022-04-06 18:05:33
297
原创 用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
3563
原创 给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
725
原创 用文件存储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
774
原创 用缓存存储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
697
原创 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
468
原创 分布式系统幂等性设计及其服务端和消费端代码实现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
803
原创 通过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
653
原创 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
864
原创 表名的动态替换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
1598
原创 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
675
原创 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
1062
原创 订单缓冲同步到订单中心代码实例
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
535
原创 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
619
原创 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
794
原创 异步编排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
579
原创 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
1127
原创 异步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
527
原创 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
496
原创 验证数据库连接有效性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
1672
原创 缓存的崩溃与快速修复
取模对于取模机制,如果其中一个实例坏掉,摘除此实例将会导致大量的缓存不命中,则瞬间的大流量导致后端数据服务或后端服务出现问题,对于这种情况,可以采用主从机制来避免实例坏了的问题,其中一个实例坏了可以用从/主顶上来,但是取模机制下增加一个节点会导致大量缓存不命中,一般是建立另一个集群,然后把数据迁移到新集群,把流量迁移过去。一致性HASH对于一致性哈希,如果其中一个实例坏了,摘除此实例只影响一致性哈希上的部分缓存不命中,不会导致大量缓存瞬间回源到后端/数据库服务,但是会产生一定的影响快速恢复如果出现
2022-03-13 14:53:27
1119
原创 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
387
原创 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
674
原创 浏览器缓存中的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
402
原创 缓存应用的回写模式
异步写CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder().using( PooledExecutionServiceConfigurationBuilder.newPooledExecutionServiceConfigurationBuilder().pool("writeBehindPool",1,5).build())org.ehcache.Cache<String,String> my
2022-03-11 16:07:11
336
原创 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
432
原创 EhCache 3.x实现
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder() .using(PooledExecutionServiceConfigurationBuilder .newPooledExecutionServiceConfigurationBuilder() .defaultPool("default",1,10).build())//磁盘存储文件的位置 .with(new CacheManagerPer
2022-03-10 16:38:28
317
原创 缓存回收策略
1.基于空间基于空间指的是设置了存储空间,如设置10m,当达到存储空间上限时,按照一定的策略进行数据移除2.基于容量基于容量指缓存设置了最大大小,当缓存的条目超过最大大小时,按照一定的策略回收数据3.基于时间3.1TTL缓存的数据从开始到到期的一个时间段,不管在这个时间段内有没有被访问,缓存数据都将过期3.2TTI空闲期,即缓存数据多久没有被访问后移除4.回收算法FIFO 先进先出,先放入缓存的先被移除FRU 最近最少使用的数据,最先被移除LFU 最不常用算法,一定时间段内使用次数最
2022-03-10 16:17:53
284
原创 服务自动切换机房代码实现
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
196
原创 使用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
780
原创 使用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
260
原创 使用配置文件实现自动降级的开关配置
应用层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
525
原创 应用节流测试代码实现
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
115
原创 分布式系统判断是否需要对接口限流的代码实现
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
125
原创 限流某个街口的总兵发数或者请求数
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
193
原创 基于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
2707
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人