tridenter的基本功能就是让不同的Spring Boot应用变成集群模式,所以配置的时候,我们要在application.properties 定义两个系统变量,否则会报错
spring.application.name=chaconne-management # 服务名称
spring.application.cluster.name=chaconne-management-cluster #集群名称
启动之后,如果在Console看到以下信息则表示集群配置生效
2021-06-05 18:20:11 [INFO ] io.undertow - starting server: Undertow - 2.0.29.Final
2021-06-05 18:20:11 [INFO ] org.xnio - XNIO version 3.3.8.Final
2021-06-05 18:20:11 [INFO ] org.xnio.nio - XNIO NIO Implementation Version 3.3.8.Final
2021-06-05 18:20:11 [INFO ] i.a.f.t.m.ApplicationMulticastGroup - Registered candidate: {applicationContextPath: http://192.168.159.1:6543, applicationName: chaconne-management, clusterName: chaconne-management-cluster, id: fafdc9ada3a5d1de3836b1a0ba4ef174, leader: false, startTime: 1622888405582, weight: 1}, Proportion: 1/1
2021-06-05 18:20:11 [INFO ] i.a.f.t.m.ApplicationRegistryCenter - Register application: [{applicationContextPath: http://192.168.159.1:6543, applicationName: chaconne-management, clusterName: chaconne-management-cluster, id: fafdc9ada3a5d1de3836b1a0ba4ef174, leader: false, startTime: 1622888405582, weight: 1}] to ApplicationRegistryCenter
2021-06-05 18:20:11 [INFO ] i.a.f.c.SerialDependencyListener - SerialDependencyHandler initialize successfully.
2021-06-05 18:20:11 [INFO ] i.a.f.t.e.ApplicationLeaderElection - This is the leader of application cluster ‘chaconne-management-cluster’. Current application event type is ‘indi.atlantis.framework.tridenter.election.ApplicationClusterLeaderEvent’
2021-06-05 18:20:11 [INFO ] i.a.f.t.e.ApplicationLeaderElection - Current leader: {applicationContextPath: http://192.168.159.1:6543, applicationName: chaconne-management, clusterName: chaconne-management-cluster, id: fafdc9ada3a5d1de3836b1a0ba4ef174, leader: true, startTime: 1622888405582, weight: 1}
2021-06-05 18:20:11 [INFO ] o.s.b.w.e.u.UndertowServletWebServer - Undertow started on port(s) 6543 (http) with context path ‘’
2021-06-05 18:20:12 [INFO ] i.a.f.c.m.ChaconneManagementMain - Started ChaconneManagementMain in 12.134 seconds (JVM running for 12.829)
首先:
2021-06-05 18:20:11 [INFO ] i.a.f.t.m.ApplicationMulticastGroup - Registered candidate: {applicationContextPath: http://192.168.159.1:6543, applicationName: chaconne-management, clusterName: chaconne-management-cluster, id: fafdc9ada3a5d1de3836b1a0ba4ef174, leader: false, startTime: 1622888405582, weight: 1}, Proportion: 1/1
2021-06-05 18:20:11 [INFO ] i.a.f.t.m.ApplicationRegistryCenter - Register application: [{applicationContextPath: http://192.168.159.1:6543, applicationName: chaconne-management, clusterName: chaconne-management-cluster, id: fafdc9ada3a5d1de3836b1a0ba4ef174, leader: false, startTime: 1622888405582, weight: 1}] to ApplicationRegistryCenter
这两行日志分别表示成功注册消息多播组和应用注册中心
2021-06-05 18:20:11 [INFO ] i.a.f.t.e.ApplicationLeaderElection - This is the leader of application cluster ‘chaconne-management-cluster’. Current application event type is ‘indi.atlantis.framework.tridenter.election.ApplicationClusterLeaderEvent’
2021-06-05 18:20:11 [INFO ] i.a.f.t.e.ApplicationLeaderElection - Current leader: {applicationContextPath: http://192.168.159.1:6543, applicationName: chaconne-management, clusterName: chaconne-management-cluster, id: fafdc9ada3a5d1de3836b1a0ba4ef174, leader: true, startTime: 1622888405582, weight: 1}
这两行日志分别表示利用ApplicationLeaderElection选举算法选出当前的应用是leader,(快速选举算法默认将第一个启动的应用作为Leader, 有点类似Jgroups)
tridenter-spring-boot-starter是一个基础型的框架,提供了各种分布式能力,下面介绍一下几种能力:
进程池
多个同名应用(${spring.application.name})可以组建成一个进程池,就像线程池分配不同的线程调用某个方法一样,进程池可以进行跨应用的方法调用,前提是这个方法是存在的
示例代码:
@MultiProcessing(value = “calc”, defaultValue = “11”)
public int calc(int a, int b) {
if (a % 3 == 0) {
throw new IllegalArgumentException("a ==> " + a);
}
log.info(“[” + counter.incrementAndGet() + "]Port: " + port + ", Execute at: " + new Date());
return a * b * 20;
}
@OnSuccess(“calc”)
public void onSuccess(Object result, MethodInvocation invocation) {
log.info("Result: " + result + ", Take: " + (System.currentTimeMillis() - invocation.getTimestamp()));
}
@OnFailure(“calc”)
public void onFailure(ThrowableProxy info, MethodInvocation invocation) {
log.info(“========================================”);
log.error(“{}”, info);
}
说明:
-
注解 @MultiProcessing修饰方法calc, 表示这个方法是多进程调用的
-
onSuccess和onFailure两个方法都是异步的调用的
方法分片
方法分片又叫方法并行处理,其实就是将一组参数的每一个参数使用进程池分发到不同应用上运行,然后再合并输出,并需要实现分片规则接口,见源码:
public interface Parallelization {
Object[] slice(Object argument); // 切片
Object merge(Object[] results); // 合并
}
示例代码:
@ParallelizingCall(value = “loop-test”, usingParallelization = TestCallParallelization.class)
public long total(String arg) {// 0,1,2,3,4,5,6,7,8,9
return 0L;
}
public static class TestCallParallelization implements Parallelization {
@Override
public Long[] slice(Object argument) {
String[] args = ((String) argument).split(“,”);
Long[] longArray = new Long[args.length];
int i = 0;
for (String arg : args) {
longArray[i++] = Long.parseLong(arg);
}
return longArray;
}
@Override
public Long merge(Object[] results) {
long total = 0;
for (Object o : results) {
total += ((Long) o).longValue();
}
return total;
}
}
说明:
-
注解@ParallelizingCall修饰total方法,表示这个方法要做分片处理
-
参数arg, 比如说你可以传 0,1,2,3,4,5,6,7,8,9,分片规则会调用slice方法将参数以“,”分割,变成数组,然后将每个值转换成long型,再分发到各个应用执行,全部执行完了,再执行merge方法进行加和操作,有点MapReduce的味道
-
total方法返回的0,是指当参数为空或方法异常返回的默认值
=====================================================================
Rest客户端
示例代码:
@RestClient(provider = “test-service”)
// @RestClient(provider = “http://192.168.159.1:5050”)
public interface TestRestClient {
@PostMapping(“/metrics/sequence/{dataType}”)
Map<String, Object> sequence(@PathVariable(“dataType”) String dataType, @RequestBody SequenceRequest sequenceRequest);
}
说明:
-
注解@RestClient修饰的接口说明这是个Http客户端
-
注解中,provider属性表示服务提供方,可以是集群中的某个应用名(${spring.application.name}),也可以是具体http地址
-
支持Spring注解(GetMapping, PostMapping, PutMapping, DeleteMapping), 此外,用注解@Api可提供更细粒度的参数设置
网关
@EnableGateway
@SpringBootApplication
@ComponentScan
public class GatewayMain {
public static void main(String[] args) {
final int port = 9000;
System.setProperty(“server.port”, String.valueOf(port));
SpringApplication.run(GatewayMain.class, args);
}
}
引用注解@EnableGateway就行了,tridenter的网关底层是用Netty4实现的
配置路由:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/ab0ca488d8e326ee34bd26a666b27448.jpeg)
最后
即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!
我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:
Dubbo面试专题
JVM面试专题
Java并发面试专题
Kafka面试专题
MongDB面试专题
MyBatis面试专题
MySQL面试专题
Netty面试专题
RabbitMQ面试专题
Redis面试专题
Spring Cloud面试专题
SpringBoot面试专题
zookeeper面试专题
常见面试算法题汇总专题
计算机网络基础专题
设计模式专题
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
SpringBoot面试专题
[外链图片转存中…(img-Tk8dNtmO-1713682288742)]
zookeeper面试专题
[外链图片转存中…(img-f7duXoQo-1713682288742)]
常见面试算法题汇总专题
[外链图片转存中…(img-Q44MrZ52-1713682288742)]
计算机网络基础专题
[外链图片转存中…(img-r64VH4Y2-1713682288742)]
设计模式专题
[外链图片转存中…(img-laQW6Ihd-1713682288742)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!