From 251a21ef97b86884e2fa9b0d55c6e4cfdc1540a4 Mon Sep 17 00:00:00 2001 From: ehlxr Date: Wed, 27 Jan 2021 11:47:09 +0800 Subject: [PATCH] Optimized code --- README.md | 6 ++ .../io/github/ehlxr/did/ServerStarter.java | 8 +- .../io/github/ehlxr/did/core/SnowFlake.java | 26 +++++ .../github/ehlxr/did/server/BaseServer.java | 12 ++- .../ehlxr/did/server/http/HttpServer.java | 95 ++++++++++++------- .../did/server/http/HttpServerHandler.java | 15 --- .../ehlxr/did/server/sdk/SdkServer.java | 90 +++++++++++------- 7 files changed, 158 insertions(+), 94 deletions(-) diff --git a/README.md b/README.md index 3e1c626..a04a14e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ # did +[![license](https://badgen.net/badge/license/MIT/blue)](./LICENSE) +[![](https://badgen.net/github/commits/ehlxr/did)](https://github.com/ehlxr/did/commits/) +[![](https://badgen.net/github/last-commit/ehlxr/did)]((https://github.com/ehlxr/did/commits/)) +[![](https://badgen.net/github/releases/ehlxr/did)](https://github.com/ehlxr/did/releases) +[![Build Status](https://ci.ehlxr.me/api/badges/ehlxr/did/status.svg)](https://ci.ehlxr.me/ehlxr/did) + 基于 SnowFlake 算法实现的分布式 ID 生成服务 ## did-server diff --git a/did-server/src/main/java/io/github/ehlxr/did/ServerStarter.java b/did-server/src/main/java/io/github/ehlxr/did/ServerStarter.java index 1083497..0f33b96 100644 --- a/did-server/src/main/java/io/github/ehlxr/did/ServerStarter.java +++ b/did-server/src/main/java/io/github/ehlxr/did/ServerStarter.java @@ -29,16 +29,14 @@ public class ServerStarter { machineId = "".equals(Constants.getEnv("MACHINES_ID")) ? machineId : Long.parseLong(Constants.getEnv("MACHINES_ID")); logger.info("SnowFlake datacenterId is: {}, machineId is: {}", datacenterId, machineId); - final SnowFlake snowFlake = new SnowFlake(datacenterId, machineId); + final SnowFlake snowFlake = SnowFlake.newBuilder().datacenterId(datacenterId).machineId(machineId).build(); // 启动 Http 服务器 - final HttpServer httpServer = new HttpServer(snowFlake); - httpServer.init(); + final Server httpServer = HttpServer.newBuilder().snowFlake(snowFlake).build(); httpServer.start(); // 启动 Sdk 服务器 - final SdkServer sdkServer = new SdkServer(snowFlake); - sdkServer.init(); + final Server sdkServer = SdkServer.newBuilder().snowFlake(snowFlake).build(); sdkServer.start(); Runtime.getRuntime().addShutdownHook(new Thread(() -> diff --git a/did-server/src/main/java/io/github/ehlxr/did/core/SnowFlake.java b/did-server/src/main/java/io/github/ehlxr/did/core/SnowFlake.java index 7be549b..c7545f2 100644 --- a/did-server/src/main/java/io/github/ehlxr/did/core/SnowFlake.java +++ b/did-server/src/main/java/io/github/ehlxr/did/core/SnowFlake.java @@ -139,4 +139,30 @@ public class SnowFlake { long end = System.currentTimeMillis(); System.out.println(end - start); } + + public static SnowFlakeBuilder newBuilder() { + return new SnowFlakeBuilder(); + } + + public static final class SnowFlakeBuilder { + private long datacenterId; + private long machineId; + + private SnowFlakeBuilder() { + } + + public SnowFlakeBuilder datacenterId(long datacenterId) { + this.datacenterId = datacenterId; + return this; + } + + public SnowFlakeBuilder machineId(long machineId) { + this.machineId = machineId; + return this; + } + + public SnowFlake build() { + return new SnowFlake(datacenterId, machineId); + } + } } diff --git a/did-server/src/main/java/io/github/ehlxr/did/server/BaseServer.java b/did-server/src/main/java/io/github/ehlxr/did/server/BaseServer.java index 66bb756..fc752bc 100644 --- a/did-server/src/main/java/io/github/ehlxr/did/server/BaseServer.java +++ b/did-server/src/main/java/io/github/ehlxr/did/server/BaseServer.java @@ -3,8 +3,10 @@ package io.github.ehlxr.did.server; import io.github.ehlxr.did.core.SnowFlake; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelOption; import io.netty.channel.DefaultEventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioServerSocketChannel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,10 +24,9 @@ public abstract class BaseServer implements Server { protected NioEventLoopGroup workGroup; protected ChannelFuture channelFuture; protected ServerBootstrap serverBootstrap; - protected int port; protected SnowFlake snowFlake; - public void init() { + protected void init() { defLoopGroup = new DefaultEventLoopGroup(Runtime.getRuntime().availableProcessors(), new ThreadFactory() { private final AtomicInteger index = new AtomicInteger(0); @@ -52,6 +53,13 @@ public abstract class BaseServer implements Server { }); serverBootstrap = new ServerBootstrap(); + + serverBootstrap.group(bossGroup, workGroup) + .channel(NioServerSocketChannel.class) + // .option(ChannelOption.SO_KEEPALIVE, true) + // .option(ChannelOption.TCP_NODELAY, true) + // .localAddress(new InetSocketAddress(port)) + .option(ChannelOption.SO_BACKLOG, 1024); } @Override diff --git a/did-server/src/main/java/io/github/ehlxr/did/server/http/HttpServer.java b/did-server/src/main/java/io/github/ehlxr/did/server/http/HttpServer.java index d941023..bf5f06e 100644 --- a/did-server/src/main/java/io/github/ehlxr/did/server/http/HttpServer.java +++ b/did-server/src/main/java/io/github/ehlxr/did/server/http/HttpServer.java @@ -4,15 +4,15 @@ import io.github.ehlxr.did.common.Constants; import io.github.ehlxr.did.core.SnowFlake; import io.github.ehlxr.did.server.BaseServer; import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.codec.http.HttpObjectAggregator; import io.netty.handler.codec.http.HttpRequestDecoder; import io.netty.handler.codec.http.HttpResponseEncoder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Objects; + /** * Http 服务器,使用 Netty 中的 Http 协议栈, * @@ -20,50 +20,23 @@ import org.slf4j.LoggerFactory; */ public class HttpServer extends BaseServer { protected Logger logger = LoggerFactory.getLogger(HttpServer.class); + private int port = "".equals(Constants.getEnv("HTTP_PORT")) ? Constants.HTTP_PORT : Integer.parseInt(Constants.getEnv("HTTP_PORT")); public HttpServer(SnowFlake snowFlake, int port) { + Objects.requireNonNull(snowFlake, "snowflake instance not allow null"); + this.snowFlake = snowFlake; - this.port = port; + this.port = port == 0 ? this.port : port; } public HttpServer(SnowFlake snowFlake) { - this.snowFlake = snowFlake; - this.port = "".equals(Constants.getEnv("HTTP_PORT")) ? - Constants.HTTP_PORT : - Integer.parseInt(Constants.getEnv("HTTP_PORT")); + this(snowFlake, 0); } - @Override - public void init() { - super.init(); - serverBootstrap.group(bossGroup, workGroup) - .channel(NioServerSocketChannel.class) - // .option(ChannelOption.SO_KEEPALIVE, false) - // .option(ChannelOption.TCP_NODELAY, true) - .option(ChannelOption.SO_BACKLOG, 1024) - // .localAddress(new InetSocketAddress(port)) - .childHandler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) { - ch.pipeline().addLast(defLoopGroup, - new HttpRequestDecoder(), - new HttpObjectAggregator(65536), - new HttpResponseEncoder(), - new HttpServerHandler(snowFlake) - ); - } - }); + public static HttpServerBuilder newBuilder() { + return new HttpServerBuilder(); } - @Override - public void start() { - try { - channelFuture = serverBootstrap.bind(port).sync(); - logger.info("HttpServer start success, port is:{}", port); - } catch (InterruptedException e) { - logger.error("HttpServer start fail,", e); - } - } @Override public void shutdown() { @@ -71,4 +44,54 @@ public class HttpServer extends BaseServer { super.shutdown(); logger.info("HttpServer shutdown finish!"); } + + @Override + public void start() { + try { + init(); + + serverBootstrap.childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel ch) { + ch.pipeline().addLast(defLoopGroup, + new HttpRequestDecoder(), + new HttpObjectAggregator(65536), + new HttpResponseEncoder(), + new HttpServerHandler(snowFlake) + ); + } + }); + + channelFuture = serverBootstrap.bind(port).sync(); + logger.info("HttpServer start success, port is:{}", port); + } catch (InterruptedException e) { + logger.error("HttpServer start fail,", e); + } + } + + public static final class HttpServerBuilder { + protected SnowFlake snowFlake; + private int port; + + private HttpServerBuilder() { + } + + public static HttpServerBuilder aHttpServer() { + return new HttpServerBuilder(); + } + + public HttpServerBuilder snowFlake(SnowFlake snowFlake) { + this.snowFlake = snowFlake; + return this; + } + + public HttpServerBuilder port(int port) { + this.port = port; + return this; + } + + public HttpServer build() { + return new HttpServer(snowFlake, port); + } + } } diff --git a/did-server/src/main/java/io/github/ehlxr/did/server/http/HttpServerHandler.java b/did-server/src/main/java/io/github/ehlxr/did/server/http/HttpServerHandler.java index d6956ff..ef77c4d 100644 --- a/did-server/src/main/java/io/github/ehlxr/did/server/http/HttpServerHandler.java +++ b/did-server/src/main/java/io/github/ehlxr/did/server/http/HttpServerHandler.java @@ -31,10 +31,7 @@ public class HttpServerHandler extends SimpleChannelInboundHandler() { - @Override - protected void initChannel(SocketChannel ch) { - ch.pipeline().addLast(defLoopGroup, - new SdkServerDecoder(12), - new SdkServerEncoder(), - new SdkServerHandler(snowFlake) - ); - } - }); - } - - @Override - public void start() { - try { - channelFuture = serverBootstrap.bind(port).sync(); - logger.info("SdkServer start success, port is:{}", port); - } catch (InterruptedException e) { - logger.error("SdkServer start fail,", e); - } + public static SdkServerBuilder newBuilder() { + return new SdkServerBuilder(); } @Override @@ -65,4 +38,49 @@ public class SdkServer extends BaseServer { super.shutdown(); logger.info("SdkServer shutdown finish!"); } + + @Override + public void start() { + try { + init(); + + serverBootstrap.childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel ch) { + ch.pipeline().addLast(defLoopGroup, + new SdkServerDecoder(12), + new SdkServerEncoder(), + new SdkServerHandler(snowFlake) + ); + } + }); + + channelFuture = serverBootstrap.bind(port).sync(); + logger.info("SdkServer start success, port is:{}", port); + } catch (InterruptedException e) { + logger.error("SdkServer start fail,", e); + } + } + + public static final class SdkServerBuilder { + protected SnowFlake snowFlake; + private int port; + + private SdkServerBuilder() { + } + + public SdkServerBuilder snowFlake(SnowFlake snowFlake) { + this.snowFlake = snowFlake; + return this; + } + + public SdkServerBuilder port(int port) { + this.port = port; + return this; + } + + public SdkServer build() { + return new SdkServer(snowFlake, port); + } + } }