系统设计
阿飞Sirx
追求自我,超越自我
展开
-
加载应用配置信息
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 阅读 · 0 评论 -
通过轮寻实现配置信息实时的推送
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 · 293 阅读 · 0 评论 -
给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 · 321 阅读 · 0 评论 -
通过RestTemplate读取配置信息
初始化RestTemplate@Configurationpublic class OpenApiConfig{ @Bean public RestTemplate restTemplate(){ SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); requestFactory.setconnectTimeout(2000); requestFactor原创 2022-04-06 18:05:33 · 242 阅读 · 0 评论 -
用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 · 3118 阅读 · 0 评论 -
给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 阅读 · 0 评论 -
用文件存储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 阅读 · 0 评论 -
用缓存存储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 阅读 · 0 评论 -
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 阅读 · 0 评论 -
分布式系统幂等性设计及其服务端和消费端代码实现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 阅读 · 0 评论 -
通过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 阅读 · 0 评论 -
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 阅读 · 0 评论 -
表名的动态替换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 阅读 · 0 评论 -
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 阅读 · 0 评论 -
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 阅读 · 0 评论 -
订单缓冲同步到订单中心代码实例
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 阅读 · 0 评论 -
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 阅读 · 0 评论 -
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 阅读 · 0 评论 -
异步编排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 阅读 · 0 评论 -
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 阅读 · 0 评论 -
异步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 阅读 · 0 评论 -
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 阅读 · 0 评论 -
验证数据库连接有效性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 阅读 · 0 评论 -
缓存的崩溃与快速修复
取模对于取模机制,如果其中一个实例坏掉,摘除此实例将会导致大量的缓存不命中,则瞬间的大流量导致后端数据服务或后端服务出现问题,对于这种情况,可以采用主从机制来避免实例坏了的问题,其中一个实例坏了可以用从/主顶上来,但是取模机制下增加一个节点会导致大量缓存不命中,一般是建立另一个集群,然后把数据迁移到新集群,把流量迁移过去。一致性HASH对于一致性哈希,如果其中一个实例坏了,摘除此实例只影响一致性哈希上的部分缓存不命中,不会导致大量缓存瞬间回源到后端/数据库服务,但是会产生一定的影响快速恢复如果出现原创 2022-03-13 14:53:27 · 1064 阅读 · 0 评论 -
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 阅读 · 0 评论 -
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 阅读 · 0 评论 -
浏览器缓存中的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 阅读 · 0 评论 -
缓存应用的回写模式
异步写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 阅读 · 0 评论 -
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 阅读 · 0 评论 -
EhCache 3.x实现
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder() .using(PooledExecutionServiceConfigurationBuilder .newPooledExecutionServiceConfigurationBuilder() .defaultPool("default",1,10).build())//磁盘存储文件的位置 .with(new CacheManagerPer原创 2022-03-10 16:38:28 · 262 阅读 · 0 评论 -
缓存回收策略
1.基于空间基于空间指的是设置了存储空间,如设置10m,当达到存储空间上限时,按照一定的策略进行数据移除2.基于容量基于容量指缓存设置了最大大小,当缓存的条目超过最大大小时,按照一定的策略回收数据3.基于时间3.1TTL缓存的数据从开始到到期的一个时间段,不管在这个时间段内有没有被访问,缓存数据都将过期3.2TTI空闲期,即缓存数据多久没有被访问后移除4.回收算法FIFO 先进先出,先放入缓存的先被移除FRU 最近最少使用的数据,最先被移除LFU 最不常用算法,一定时间段内使用次数最原创 2022-03-10 16:17:53 · 219 阅读 · 0 评论 -
服务自动切换机房代码实现
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 阅读 · 0 评论 -
使用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 阅读 · 0 评论 -
使用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 阅读 · 0 评论 -
使用配置文件实现自动降级的开关配置
应用层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 阅读 · 0 评论 -
应用节流测试代码实现
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 阅读 · 0 评论 -
分布式系统判断是否需要对接口限流的代码实现
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 阅读 · 0 评论 -
限流某个街口的总兵发数或者请求数
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 阅读 · 0 评论 -
基于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 阅读 · 0 评论 -
Hystrix服务隔离实例
public class GetStockServiceCommand extends HystrixCommand<String>{ private StockService stockService; public GetStockServiceCommand(){ super(setter()); } private static Setter setter(){ //服务分组 HystrixCommandGroupKey groupKey =原创 2022-01-22 18:39:19 · 362 阅读 · 0 评论