目前大二下(双非),正在实习,是Java开发岗位,技术栈就学到cloud,看了两遍cloud视频,但是很久没用了。像那些nginx、es我都没学。(es之前看了两遍现在已经不会了)
算法力扣200+,简单题可以写,中等题基本G了的水平。
实习的时候也在看书,MySQL技术内幕、jvm、Redis啥的,所以现在八股能力 > 码力
这个暑假想学一点大数据开发相关的东西,建议吗?我打算是这个暑假刷一些题,每天三道吧,然后再学一些大数据有关的东西。
或者说有没有什么建议的学习内容吗?其实学大数据的技术栈的时间可以替换成其他的,但是我不知道学啥了。求佬给建议~每一个建议我都会认真看的。
可以的话我给一些建议:
建议: 1. 推荐学习大数据相关的基础知识,包括Hadoop生态圈、Spark、Flume、Kafka、Hive等,可以通过在线课程、书籍等途径进行学习。 2. 学习Elasticsearch(以下简称es)可以提高检索性能,对于实时性要求不太高的业务场景,可以作为替代关系型数据库的方案。可以通过官方文档、书籍等途径进行学习。 3. 学习Nginx可以用于反向代理、负载均衡、限流等,可以提高系统可用性和性能,可以通过官方文档、书籍等途径进行学习。 4. 可以学习观察者模式,可以用于实现事件监听、消息通知等功能,可以通过书籍、代码实践等途径进行学习。 5. 建议了解服务注册与发现,可以通过Spring Cloud Eureka或者Zookeeper进行实践。
针对限流相关的知识,以下是一个基于令牌桶算法的Java实现示例:
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class TokenBucket {
private int capacity; //桶的大小
private double rate; //令牌产生速度(token/s)
private int tokens; //当前桶中的令牌数
private long lastTime; //上次令牌产生时间
private BlockingQueue<Object> queue; //用于存储请求的队列
public TokenBucket(int capacity, double rate) {
this.capacity = capacity;
this.rate = rate;
this.tokens = capacity;
this.lastTime = System.currentTimeMillis();
this.queue = new ArrayBlockingQueue<>(capacity);
init();
}
private void init() {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
int count = (int) (System.currentTimeMillis() - lastTime) * rate / 1000;
tokens = Math.min(capacity, tokens + count);
lastTime = System.currentTimeMillis();
}
}, 1, 1, TimeUnit.SECONDS);
}
public boolean acquire(long timeout, TimeUnit unit) throws InterruptedException {
boolean success = queue.offer(new Object(), timeout, unit);
if (!success) {
return false;
}
synchronized (this) {
if (tokens > 0) {
tokens--;
return true;
} else {
queue.poll();
return false;
}
}
}
}
上述代码中,令牌桶的大小和令牌产生速度可以通过构造函数进行设置。在桶中存储请求的队列采用了阻塞队列的实现,当队列满了时,新的请求会被拒绝。acquire方法用于从桶中获取令牌,如果获取成功,返回true,否则返回false。
针对Nginx路径前缀的处理,可以通过配置文件进行设置,以下是一个示例:
server {
listen 80;
server_name crazydemo.com;
location /demo-provider/ {
proxy_pass http://provider_ip:provider_port/api/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
在location中设置了路径前缀为/demo-provider/,对于请求 http://crazydemo.com:7799/demo-provider/api/demo/hello/v1,会被转发到 http://provider_ip:provider_port/api/demo/hello/v1。
针对Nginx错误页面的配置,可以通过下列语句进行设置:
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
上述代码中,404错误会被重定向到/404.html,而500、502、503、504错误会被重定向到/50x.html。
对于Linux环境下使用环境变量配置中间件相关信息,可以通过export语句设置环境变量,例如:
export PROVIDER_IP=192.168.0.1
export PROVIDER_PORT=8080
在代码中可以通过System.getenv()方法获取环境变量的值,例如:
String providerIp = System.getenv("PROVIDER_IP");
String providerPort = System.getenv("PROVIDER_PORT");