From c60c140235271be5b2bda2f872df685581aa9d78 Mon Sep 17 00:00:00 2001 From: bl03615 Date: Thu, 19 Aug 2021 00:52:32 +0800 Subject: [PATCH 1/9] =?UTF-8?q?1.=EF=BC=88=E5=BF=85=E5=81=9A=EF=BC=89?= =?UTF-8?q?=E6=95=B4=E5=90=88=E4=BD=A0=E4=B8=8A=E6=AC=A1=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E7=9A=84=20httpclient/okhttp=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gateway/client/HttpClientTest.java | 50 ++++++++++++++++ .../gateway/inbound/HttpInboundServer.java | 1 + .../gateway/server/HttpServerTest.java | 60 +++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/client/HttpClientTest.java create mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/server/HttpServerTest.java diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/HttpClientTest.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/HttpClientTest.java new file mode 100644 index 00000000..33cfe8d5 --- /dev/null +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/HttpClientTest.java @@ -0,0 +1,50 @@ +package io.github.kimmking.gateway.client; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpStatus; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; + +import java.io.IOException; +import java.util.Objects; + +public class HttpClientTest { + + public static void main(String[] args) throws IOException { + + CloseableHttpResponse response = null; + HttpGet get = null; + + CloseableHttpClient client = HttpClients.createDefault(); + + try { + StringBuilder url = new StringBuilder("http://localhost:8888"); + get = new HttpGet(url.toString()); + + response = client.execute(get); + if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { + HttpEntity entity = response.getEntity(); + String html = EntityUtils.toString(entity, "utf-8"); + System.out.println(html); + } + } catch (Exception e){ + e.printStackTrace(); + } + finally { + if (Objects.nonNull(response)) { + response.close(); + } + + if (Objects.nonNull(get)) { + get.releaseConnection(); + } + + client.close(); + } + + } + +} diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundServer.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundServer.java index 97d54ccd..6193781a 100644 --- a/02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundServer.java +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundServer.java @@ -53,6 +53,7 @@ public void run() throws Exception { System.out.println("开启netty http服务器,监听地址和端口为 http://127.0.0.1:" + port + '/'); ch.closeFuture().sync(); } finally { + System.out.println("关闭线程组"); bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/server/HttpServerTest.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/server/HttpServerTest.java new file mode 100644 index 00000000..753c8813 --- /dev/null +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/server/HttpServerTest.java @@ -0,0 +1,60 @@ +package io.github.kimmking.gateway.server; + +import java.io.IOException; +import java.io.PrintWriter; +import java.net.ServerSocket; +import java.net.Socket; + +public class HttpServerTest { + + static int port = 8801; + + public static void main(String[] args) throws IOException { + + if (args != null && args.length > 0) { + try { + port = Integer.valueOf(args[0]); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + + } + + ServerSocket serverSocket = new ServerSocket(port); + + while (true){ + try { + Socket socket = serverSocket.accept(); + service(socket); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + + private static void service(Socket socket) { + + try { + PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true); + printWriter.println("HTTP/1.1 200 OK"); + printWriter.println("Content-Type:text/html;charset=utf-8"); + String body = "hello,nio" + port; + printWriter.println("Content-Length:" + body.getBytes().length); + printWriter.println(); + + printWriter.write(body); + printWriter.close(); + + //这里主要是为了让httpClient可以在server的socket关闭前,拿到返回的结果 + Thread.sleep(10); + + socket.close(); + + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + + } + +} From 1f0224e46cedb2a5fc5604e2e790a90645ea7d95 Mon Sep 17 00:00:00 2001 From: bl03615 Date: Thu, 19 Aug 2021 13:04:16 +0800 Subject: [PATCH 2/9] =?UTF-8?q?3.=EF=BC=88=E5=BF=85=E5=81=9A=EF=BC=89?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E8=BF=87=E6=BB=A4=E5=99=A8=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gateway/filter/MyHttpRequestFilter.java | 16 ++++++++++++++++ .../gateway/inbound/HttpInboundHandler.java | 8 ++------ .../httpclient4/HttpOutboundHandler.java | 5 +++-- 3 files changed, 21 insertions(+), 8 deletions(-) create mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/filter/MyHttpRequestFilter.java diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/filter/MyHttpRequestFilter.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/filter/MyHttpRequestFilter.java new file mode 100644 index 00000000..419e6abd --- /dev/null +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/filter/MyHttpRequestFilter.java @@ -0,0 +1,16 @@ +package io.github.kimmking.gateway.filter; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.http.FullHttpRequest; + +/** + * 自己实现的filter + */ +public class MyHttpRequestFilter implements HttpRequestFilter { + + @Override + public void filter(FullHttpRequest fullRequest, ChannelHandlerContext ctx) { + System.out.println("header content set in the filter"); + fullRequest.headers().set("xjava","Paulguard"); + } +} diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundHandler.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundHandler.java index 69b40fde..4eb9ef2a 100644 --- a/02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundHandler.java +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundHandler.java @@ -1,23 +1,19 @@ package io.github.kimmking.gateway.inbound; -import io.github.kimmking.gateway.filter.HeaderHttpRequestFilter; -import io.github.kimmking.gateway.filter.HttpRequestFilter; +import io.github.kimmking.gateway.filter.MyHttpRequestFilter; import io.github.kimmking.gateway.outbound.httpclient4.HttpOutboundHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.handler.codec.http.FullHttpRequest; import io.netty.util.ReferenceCountUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.List; public class HttpInboundHandler extends ChannelInboundHandlerAdapter { - private static Logger logger = LoggerFactory.getLogger(HttpInboundHandler.class); private final List proxyServer; private HttpOutboundHandler handler; - private HttpRequestFilter filter = new HeaderHttpRequestFilter(); + private MyHttpRequestFilter filter = new MyHttpRequestFilter(); public HttpInboundHandler(List proxyServer) { this.proxyServer = proxyServer; diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/httpclient4/HttpOutboundHandler.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/httpclient4/HttpOutboundHandler.java index c20c9be5..6acab5f1 100644 --- a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/httpclient4/HttpOutboundHandler.java +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/httpclient4/HttpOutboundHandler.java @@ -23,9 +23,7 @@ import org.apache.http.util.EntityUtils; import java.util.List; -import java.util.Random; import java.util.concurrent.*; -import java.util.logging.Filter; import java.util.stream.Collectors; import static io.netty.handler.codec.http.HttpResponseStatus.NO_CONTENT; @@ -84,6 +82,9 @@ private void fetchGet(final FullHttpRequest inbound, final ChannelHandlerContext //httpGet.setHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_CLOSE); httpGet.setHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_KEEP_ALIVE); httpGet.setHeader("mao", inbound.headers().get("mao")); + httpGet.setHeader("javaParam",inbound.headers().get("xjava")); + + System.out.println("xjava:" + inbound.headers().get("xjava")); httpclient.execute(httpGet, new FutureCallback() { @Override From 533ab827e9277ded4b4584d61411d974c1d2f45d Mon Sep 17 00:00:00 2001 From: bl03615 Date: Sat, 21 Aug 2021 21:36:28 +0800 Subject: [PATCH 3/9] =?UTF-8?q?4.=EF=BC=88=E9=80=89=E5=81=9A=EF=BC=89?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E8=B7=AF=E7=94=B1=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gateway/client/HttpClientTest.java | 17 +++++--- .../httpclient4/HttpOutboundHandler.java | 14 ++++-- .../gateway/router/HttpEndpointRouter.java | 2 + .../router/RandomHttpEndpointRouter.java | 5 +++ .../router/WeightHttpEndPointRouter.java | 43 +++++++++++++++++++ 5 files changed, 73 insertions(+), 8 deletions(-) create mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/router/WeightHttpEndPointRouter.java diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/HttpClientTest.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/HttpClientTest.java index 33cfe8d5..403936c0 100644 --- a/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/HttpClientTest.java +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/HttpClientTest.java @@ -15,15 +15,23 @@ public class HttpClientTest { public static void main(String[] args) throws IOException { + for (int i = 0; i < 10; i++) { + httpGet(); + } + + } + + private static void httpGet() throws IOException { + CloseableHttpResponse response = null; HttpGet get = null; - - CloseableHttpClient client = HttpClients.createDefault(); + CloseableHttpClient client = null; try { - StringBuilder url = new StringBuilder("http://localhost:8888"); - get = new HttpGet(url.toString()); + client = HttpClients.createDefault(); + + get = new HttpGet("http://localhost:8888"); response = client.execute(get); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { HttpEntity entity = response.getEntity(); @@ -44,7 +52,6 @@ public static void main(String[] args) throws IOException { client.close(); } - } } diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/httpclient4/HttpOutboundHandler.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/httpclient4/HttpOutboundHandler.java index 6acab5f1..a03b57bf 100644 --- a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/httpclient4/HttpOutboundHandler.java +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/httpclient4/HttpOutboundHandler.java @@ -4,8 +4,8 @@ import io.github.kimmking.gateway.filter.HeaderHttpResponseFilter; import io.github.kimmking.gateway.filter.HttpRequestFilter; import io.github.kimmking.gateway.filter.HttpResponseFilter; +import io.github.kimmking.gateway.router.WeightHttpEndPointRouter; import io.github.kimmking.gateway.router.HttpEndpointRouter; -import io.github.kimmking.gateway.router.RandomHttpEndpointRouter; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; @@ -22,6 +22,7 @@ import org.apache.http.protocol.HTTP; import org.apache.http.util.EntityUtils; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.*; import java.util.stream.Collectors; @@ -37,7 +38,7 @@ public class HttpOutboundHandler { private List backendUrls; HttpResponseFilter filter = new HeaderHttpResponseFilter(); - HttpEndpointRouter router = new RandomHttpEndpointRouter(); + HttpEndpointRouter router = new WeightHttpEndPointRouter(); public HttpOutboundHandler(List backends) { @@ -71,9 +72,16 @@ private String formatUrl(String backend) { } public void handle(final FullHttpRequest fullRequest, final ChannelHandlerContext ctx, HttpRequestFilter filter) { - String backendUrl = router.route(this.backendUrls); + + List weights = new ArrayList<>(); + weights.add(70); + weights.add(30); + + String backendUrl = router.route(this.backendUrls,weights); final String url = backendUrl + fullRequest.uri(); filter.filter(fullRequest, ctx); + + //TODO ExcutorService now,use netty instead proxyService.submit(()->fetchGet(fullRequest, ctx, url)); } diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/router/HttpEndpointRouter.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/router/HttpEndpointRouter.java index 8e307ab7..fc3a0a51 100644 --- a/02nio/nio02/src/main/java/io/github/kimmking/gateway/router/HttpEndpointRouter.java +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/router/HttpEndpointRouter.java @@ -5,6 +5,8 @@ public interface HttpEndpointRouter { String route(List endpoints); + + String route(List endpoints,List weight); // Load Balance // Random diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/router/RandomHttpEndpointRouter.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/router/RandomHttpEndpointRouter.java index 684d1ba5..7352eae7 100644 --- a/02nio/nio02/src/main/java/io/github/kimmking/gateway/router/RandomHttpEndpointRouter.java +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/router/RandomHttpEndpointRouter.java @@ -10,4 +10,9 @@ public String route(List urls) { Random random = new Random(System.currentTimeMillis()); return urls.get(random.nextInt(size)); } + + @Override + public String route(List endpoints, List weight) { + throw new RuntimeException("Unsupported Method"); + } } diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/router/WeightHttpEndPointRouter.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/router/WeightHttpEndPointRouter.java new file mode 100644 index 00000000..517b6465 --- /dev/null +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/router/WeightHttpEndPointRouter.java @@ -0,0 +1,43 @@ +package io.github.kimmking.gateway.router; + +import java.util.List; +import java.util.Random; + +public class WeightHttpEndPointRouter implements HttpEndpointRouter { + + @Override + public String route(List endpoints) { + throw new RuntimeException("Unsupported Method"); + } + + @Override + public String route(List endpoints, List weight) { + + Random random = new Random(System.currentTimeMillis()); + int randomInt = random.nextInt(100); + + for (int i = 0; i < weight.size(); i++) { + + if (i == weight.size() - 1) { + return endpoints.get(i); + } + + Integer curWeight = weight.get(i); + if (randomInt > curWeight) { + continue; + } + + return endpoints.get(i); + } + + return endpoints.get(0); + } + + public static void main(String[] args) { + Random random = new Random(System.currentTimeMillis()); + System.out.println(random.nextInt(100)); + System.out.println(random.nextInt(100)); + System.out.println(random.nextInt(100)); + System.out.println(random.nextInt(100)); + } +} From 1b359bab10d004e56d4e76156fee7843cf5a2a19 Mon Sep 17 00:00:00 2001 From: bl03615 Date: Sun, 22 Aug 2021 15:25:35 +0800 Subject: [PATCH 4/9] =?UTF-8?q?2.=EF=BC=88=E9=80=89=E5=81=9A=EF=BC=89?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=20netty=20=E5=AE=9E=E7=8E=B0=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=20http=20=E8=AE=BF=E9=97=AE=EF=BC=88=E4=BB=A3?= =?UTF-8?q?=E6=9B=BF=E4=B8=8A=E4=B8=80=E6=AD=A5=E9=AA=A4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gateway/client/HttpClientHandler.java | 34 +++++++++++++ .../gateway/client/NettyClientTest.java | 48 +++++++++++++++++++ .../httpclient4/HttpOutboundHandler.java | 4 +- 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/client/HttpClientHandler.java create mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/client/NettyClientTest.java diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/HttpClientHandler.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/HttpClientHandler.java new file mode 100644 index 00000000..5958a762 --- /dev/null +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/HttpClientHandler.java @@ -0,0 +1,34 @@ +package io.github.kimmking.gateway.client; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.handler.codec.http.*; +import io.netty.util.CharsetUtil; + +import java.net.URI; + +public class HttpClientHandler extends ChannelInboundHandlerAdapter { + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + URI uri = new URI("/user/get"); + FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_0, HttpMethod.GET, uri.toASCIIString()); + request.headers().add(HttpHeaderNames.CONNECTION,HttpHeaderValues.KEEP_ALIVE); + request.headers().add(HttpHeaderNames.CONTENT_LENGTH,request.content().readableBytes()); + ctx.writeAndFlush(request); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + System.out.println("msg ->" + msg); + + if (msg instanceof FullHttpRequest) { + FullHttpResponse response = (FullHttpResponse) msg; + ByteBuf buf = response.content(); + String result = buf.toString(CharsetUtil.UTF_8); + System.out.println("response -> " + result); + + } + } +} diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/NettyClientTest.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/NettyClientTest.java new file mode 100644 index 00000000..17cbf556 --- /dev/null +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/NettyClientTest.java @@ -0,0 +1,48 @@ +package io.github.kimmking.gateway.client; + +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.codec.http.HttpClientCodec; +import io.netty.handler.codec.http.HttpContentDecompressor; +import io.netty.handler.codec.http.HttpObjectAggregator; + +public class NettyClientTest { + + public static void start(String host,int port){ + + EventLoopGroup group = new NioEventLoopGroup(); + + try { + Bootstrap b = new Bootstrap(); + b.group(group) + .channel(NioSocketChannel.class) + .option(ChannelOption.SO_KEEPALIVE,true) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(Channel ch) throws Exception { + ch.pipeline().addLast(new HttpClientCodec()); + ch.pipeline().addLast(new HttpObjectAggregator(65536)); + ch.pipeline().addLast(new HttpContentDecompressor()); + ch.pipeline().addLast(new HttpClientHandler()); + } + }); + + ChannelFuture future = b.connect(host, port).sync(); + ChannelFuture channelFuture = future.channel().closeFuture().sync(); + + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + System.out.println("关闭线程组"); + group.shutdownGracefully(); + } + + } + + public static void main(String[] args) { + start("localhost",8888); + } + +} diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/httpclient4/HttpOutboundHandler.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/httpclient4/HttpOutboundHandler.java index a03b57bf..c60564e3 100644 --- a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/httpclient4/HttpOutboundHandler.java +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/httpclient4/HttpOutboundHandler.java @@ -79,9 +79,11 @@ public void handle(final FullHttpRequest fullRequest, final ChannelHandlerContex String backendUrl = router.route(this.backendUrls,weights); final String url = backendUrl + fullRequest.uri(); + + System.out.println("被访问的url:"+url); + filter.filter(fullRequest, ctx); - //TODO ExcutorService now,use netty instead proxyService.submit(()->fetchGet(fullRequest, ctx, url)); } From 1819261e988816831c3d263956306a3955a97de4 Mon Sep 17 00:00:00 2001 From: bl03615 Date: Mon, 23 Aug 2021 00:19:22 +0800 Subject: [PATCH 5/9] =?UTF-8?q?5.=EF=BC=88=E9=80=89=E5=81=9A=EF=BC=89?= =?UTF-8?q?=E8=B7=91=E4=B8=80=E8=B7=91=E8=AF=BE=E4=B8=8A=E7=9A=84=E5=90=84?= =?UTF-8?q?=E4=B8=AA=E4=BE=8B=E5=AD=90=EF=BC=8C=E5=8A=A0=E6=B7=B1=E5=AF=B9?= =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B=E7=9A=84=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thread/github/pxd/TestDemonThread.java | 29 +++++++++++++ .../thread/github/pxd/ThreadJoinTest.java | 41 +++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 02nio/nio02/src/main/java/thread/github/pxd/TestDemonThread.java create mode 100644 02nio/nio02/src/main/java/thread/github/pxd/ThreadJoinTest.java diff --git a/02nio/nio02/src/main/java/thread/github/pxd/TestDemonThread.java b/02nio/nio02/src/main/java/thread/github/pxd/TestDemonThread.java new file mode 100644 index 00000000..18137a5a --- /dev/null +++ b/02nio/nio02/src/main/java/thread/github/pxd/TestDemonThread.java @@ -0,0 +1,29 @@ +package thread.github.pxd; + +public class TestDemonThread { + + public static void main(String[] args) { + + Runnable task = () -> { + + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + Thread t = Thread.currentThread(); + System.out.println("当前线程:" + t.getName()); + + }; + + Thread thread = new Thread(task); + thread.setName("test-thread-1"); + + //这个地方如果是守护线程,那么进程里所有的线程都是守护线程,则会在进程结束的时候,会清理掉所有线程 + //thread.setDaemon(true); + thread.start(); + + } + +} diff --git a/02nio/nio02/src/main/java/thread/github/pxd/ThreadJoinTest.java b/02nio/nio02/src/main/java/thread/github/pxd/ThreadJoinTest.java new file mode 100644 index 00000000..32a33707 --- /dev/null +++ b/02nio/nio02/src/main/java/thread/github/pxd/ThreadJoinTest.java @@ -0,0 +1,41 @@ +package thread.github.pxd; + +public class ThreadJoinTest { + + public static void main(String[] args) { + + Runnable task = () -> { + + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + Thread t = Thread.currentThread(); + System.out.println("当前线程:" + t.getName()); + + }; + + Thread thread1 = new Thread(task); + thread1.setName("test-thread-1"); + + Thread thread2 = new Thread(() -> { + try { + Thread t = Thread.currentThread(); + System.out.println("当前线程:" + t.getName()); + + thread1.join(); + + } catch (InterruptedException e) { + e.printStackTrace(); + } + + }); + thread2.setName("test-thread-2"); + + thread1.start(); + thread2.start(); + } + +} From d4f3666064ffec2650928875cc1cf55c5730fa53 Mon Sep 17 00:00:00 2001 From: bl03615 Date: Mon, 23 Aug 2021 00:38:21 +0800 Subject: [PATCH 6/9] =?UTF-8?q?5.=EF=BC=88=E9=80=89=E5=81=9A=EF=BC=89?= =?UTF-8?q?=E8=B7=91=E4=B8=80=E8=B7=91=E8=AF=BE=E4=B8=8A=E7=9A=84=E5=90=84?= =?UTF-8?q?=E4=B8=AA=E4=BE=8B=E5=AD=90=EF=BC=8C=E5=8A=A0=E6=B7=B1=E5=AF=B9?= =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B=E7=9A=84=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thread/github/pxd/ThreadABCPrint.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 02nio/nio02/src/main/java/thread/github/pxd/ThreadABCPrint.java diff --git a/02nio/nio02/src/main/java/thread/github/pxd/ThreadABCPrint.java b/02nio/nio02/src/main/java/thread/github/pxd/ThreadABCPrint.java new file mode 100644 index 00000000..1ef0e613 --- /dev/null +++ b/02nio/nio02/src/main/java/thread/github/pxd/ThreadABCPrint.java @@ -0,0 +1,44 @@ +package thread.github.pxd; + +public class ThreadABCPrint { + + volatile static int completeThread = 0; + + public static void main(String[] args) { + + Thread thread1 = new Thread(() -> { + while (true){ + + if (completeThread == 3 || completeThread == 0) { + System.out.print("A"); + completeThread = 1; + } + } + }); + + Thread thread2 = new Thread(() -> { + while (true){ + + if (completeThread == 1) { + System.out.print("B"); + completeThread = 2; + } + } + }); + + Thread thread3 = new Thread(() -> { + while (true){ + + if (completeThread == 2) { + System.out.print("C"); + completeThread = 3; + } + } + }); + + thread1.start(); + thread2.start(); + thread3.start(); + } + +} From d020db693af9ab3e38fb6acd040c80c09275e2c9 Mon Sep 17 00:00:00 2001 From: pingxiangdong Date: Sun, 3 Oct 2021 01:21:06 +0800 Subject: [PATCH 7/9] =?UTF-8?q?3.=E5=BF=85=E5=81=9A=EF=BC=8C=E7=AC=AC?= =?UTF-8?q?=E4=B8=80=E6=AD=A5=EF=BC=9A=E5=B0=9D=E8=AF=95=E5=B0=86=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E7=AB=AF=E5=86=99=E6=AD=BB=E6=9F=A5=E6=89=BE=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=AE=9E=E7=8E=B0=E7=B1=BB=E5=8F=98=E6=88=90=E6=B3=9B?= =?UTF-8?q?=E5=9E=8B=E5=92=8C=E5=8F=8D=E5=B0=84=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/kimmking/rpcfx/api/RpcfxResolver.java | 2 +- .../kimmking/rpcfx/server/RpcfxInvoker.java | 29 +++++-- .../rpcfx/demo/provider/DemoResolver.java | 83 +++++++++++++++++-- .../demo/provider/RpcfxServerApplication.java | 14 +--- 4 files changed, 101 insertions(+), 27 deletions(-) diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/RpcfxResolver.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/RpcfxResolver.java index f7c48068..f1fa6b23 100644 --- a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/RpcfxResolver.java +++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/RpcfxResolver.java @@ -2,6 +2,6 @@ public interface RpcfxResolver { - Object resolve(String serviceClass); + Class resolve(String serviceClass); } diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/server/RpcfxInvoker.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/server/RpcfxInvoker.java index a6f77dac..8c4706f8 100644 --- a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/server/RpcfxInvoker.java +++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/server/RpcfxInvoker.java @@ -1,15 +1,17 @@ package io.kimmking.rpcfx.server; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.Objects; + import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; + import io.kimmking.rpcfx.api.RpcfxRequest; import io.kimmking.rpcfx.api.RpcfxResolver; import io.kimmking.rpcfx.api.RpcfxResponse; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Arrays; - public class RpcfxInvoker { private RpcfxResolver resolver; @@ -20,14 +22,27 @@ public RpcfxInvoker(RpcfxResolver resolver){ public RpcfxResponse invoke(RpcfxRequest request) { RpcfxResponse response = new RpcfxResponse(); + + //这里肯定是接口类的全路径 String serviceClass = request.getServiceClass(); // 作业1:改成泛型和反射 - Object service = resolver.resolve(serviceClass);//this.applicationContext.getBean(serviceClass); + Class service = resolver.resolve(serviceClass);//this.applicationContext.getBean(serviceClass); + + Object serviceInterfaceImpl = null; + try { + serviceInterfaceImpl = service.newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + e.printStackTrace(); + } + + if (Objects.isNull(serviceInterfaceImpl)) { + throw new RuntimeException("serviceInterfaceImpl is null!"); + } try { - Method method = resolveMethodFromClass(service.getClass(), request.getMethod()); - Object result = method.invoke(service, request.getParams()); // dubbo, fastjson, + Method method = resolveMethodFromClass(serviceInterfaceImpl.getClass(), request.getMethod()); + Object result = method.invoke(serviceInterfaceImpl, request.getParams()); // dubbo, fastjson, // 两次json序列化能否合并成一个 response.setResult(JSON.toJSONString(result, SerializerFeature.WriteClassName)); response.setStatus(true); diff --git a/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/DemoResolver.java b/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/DemoResolver.java index 65cffbd2..70d3aa40 100644 --- a/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/DemoResolver.java +++ b/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/DemoResolver.java @@ -1,20 +1,85 @@ package io.kimmking.rpcfx.demo.provider; +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; + import io.kimmking.rpcfx.api.RpcfxResolver; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -public class DemoResolver implements RpcfxResolver, ApplicationContextAware { +public class DemoResolver implements RpcfxResolver { - private ApplicationContext applicationContext; + private final String IMPL_PACKAGE = "io.kimmking.rpcfx.demo.provider"; @Override - public void setApplicationContext(ApplicationContext applicationContext) { - this.applicationContext = applicationContext; + public Class resolve(String serviceClass) { + + Class interfaceClass = null; + try { + interfaceClass = Class.forName(serviceClass); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + + List> allClasses = getAllClassByPatch(IMPL_PACKAGE); + + List> classList = new ArrayList<>(); + for (int i = 0; i < allClasses.size(); i++) { + + //判断是不是同一个接口 + if (interfaceClass.isAssignableFrom(allClasses.get(i))) { + if (!interfaceClass.equals(allClasses.get(i))) { + classList.add(allClasses.get(i)); + } + } + } + + return classList.get(0); } - @Override - public Object resolve(String serviceClass) { - return this.applicationContext.getBean(serviceClass); + private List> getAllClassByPatch(String implPackage) { + ArrayList> list = new ArrayList<>(); + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + String path = implPackage.replace('.', '/'); + try { + ArrayList fileList = new ArrayList<>(); + Enumeration enumeration = classLoader.getResources(path); + while (enumeration.hasMoreElements()) { + URL url = enumeration.nextElement(); + fileList.add(new File(url.getFile())); + } + for (int i = 0; i < fileList.size(); i++) { + list.addAll(findClass(fileList.get(i),implPackage)); + } + } catch (IOException e) { + e.printStackTrace(); + } + return list; + } + + private static ArrayList> findClass(File file,String packagename) { + ArrayList> list = new ArrayList<>(); + if (!file.exists()) { + return list; + } + File[] files = file.listFiles(); + for (File file2 : files) { + if (file2.isDirectory()) { + assert !file2.getName().contains(".");//添加断言用于判断 + ArrayList> arrayList = findClass(file2, packagename+"."+file2.getName()); + list.addAll(arrayList); + }else if(file2.getName().endsWith(".class")){ + try { + //保存的类文件不需要后缀.class + list.add(Class.forName(packagename + '.' + file2.getName().substring(0, + file2.getName().length()-6))); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + } + return list; } } diff --git a/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/RpcfxServerApplication.java b/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/RpcfxServerApplication.java index d79e422e..e3a27cd4 100644 --- a/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/RpcfxServerApplication.java +++ b/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/RpcfxServerApplication.java @@ -1,6 +1,5 @@ package io.kimmking.rpcfx.demo.provider; -import com.alibaba.fastjson.JSON; import io.kimmking.rpcfx.api.RpcfxRequest; import io.kimmking.rpcfx.api.RpcfxResolver; import io.kimmking.rpcfx.api.RpcfxResponse; @@ -8,10 +7,7 @@ import io.kimmking.rpcfx.demo.api.OrderService; import io.kimmking.rpcfx.demo.api.UserService; import io.kimmking.rpcfx.server.RpcfxInvoker; -import org.apache.curator.RetryPolicy; import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.CuratorFrameworkFactory; -import org.apache.curator.retry.ExponentialBackoffRetry; import org.apache.zookeeper.CreateMode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; @@ -22,8 +18,6 @@ import org.springframework.web.bind.annotation.RestController; import java.net.InetAddress; -import java.net.InterfaceAddress; -import java.net.UnknownHostException; @SpringBootApplication @RestController @@ -93,13 +87,13 @@ public RpcfxResolver createResolver(){ // annotation - @Bean(name = "io.kimmking.rpcfx.demo.api.UserService") - public UserService createUserService(){ + @Bean//(name = "io.kimmking.rpcfx.demo.api.UserService") + public UserService userService(){ return new UserServiceImpl(); } - @Bean(name = "io.kimmking.rpcfx.demo.api.OrderService") - public OrderService createOrderService(){ + @Bean//(name = "io.kimmking.rpcfx.demo.api.OrderService") + public OrderService orderService(){ return new OrderServiceImpl(); } From 372908af098292e37149031d1d98931ce9b71758 Mon Sep 17 00:00:00 2001 From: pingxiangdong Date: Mon, 4 Oct 2021 00:14:12 +0800 Subject: [PATCH 8/9] =?UTF-8?q?3.=E5=BF=85=E5=81=9A=EF=BC=8C=E7=AC=AC?= =?UTF-8?q?=E4=B8=80=E6=AD=A5=EF=BC=9A=E5=B0=9D=E8=AF=95=E5=B0=86=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E7=AB=AF=E5=86=99=E6=AD=BB=E6=9F=A5=E6=89=BE=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=AE=9E=E7=8E=B0=E7=B1=BB=E5=8F=98=E6=88=90=E6=B3=9B?= =?UTF-8?q?=E5=9E=8B=E5=92=8C=E5=8F=8D=E5=B0=84=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/kimmking/rpcfx/api/RpcfxResolver.java | 2 +- .../kimmking/rpcfx/server/RpcfxInvoker.java | 29 +++---- .../rpcfx/demo/provider/DemoResolver.java | 83 ++----------------- .../demo/provider/RpcfxServerApplication.java | 4 +- 4 files changed, 22 insertions(+), 96 deletions(-) diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/RpcfxResolver.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/RpcfxResolver.java index f1fa6b23..d74909b2 100644 --- a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/RpcfxResolver.java +++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/RpcfxResolver.java @@ -2,6 +2,6 @@ public interface RpcfxResolver { - Class resolve(String serviceClass); + T resolve(String serviceClass,Class type); } diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/server/RpcfxInvoker.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/server/RpcfxInvoker.java index 8c4706f8..4a196697 100644 --- a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/server/RpcfxInvoker.java +++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/server/RpcfxInvoker.java @@ -1,17 +1,15 @@ package io.kimmking.rpcfx.server; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.Objects; - import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; - import io.kimmking.rpcfx.api.RpcfxRequest; import io.kimmking.rpcfx.api.RpcfxResolver; import io.kimmking.rpcfx.api.RpcfxResponse; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Arrays; + public class RpcfxInvoker { private RpcfxResolver resolver; @@ -22,27 +20,20 @@ public RpcfxInvoker(RpcfxResolver resolver){ public RpcfxResponse invoke(RpcfxRequest request) { RpcfxResponse response = new RpcfxResponse(); - - //这里肯定是接口类的全路径 String serviceClass = request.getServiceClass(); // 作业1:改成泛型和反射 - Class service = resolver.resolve(serviceClass);//this.applicationContext.getBean(serviceClass); - - Object serviceInterfaceImpl = null; + Class interfaceClass = null; try { - serviceInterfaceImpl = service.newInstance(); - } catch (InstantiationException | IllegalAccessException e) { + interfaceClass = Class.forName(serviceClass); + } catch (ClassNotFoundException e) { e.printStackTrace(); } - - if (Objects.isNull(serviceInterfaceImpl)) { - throw new RuntimeException("serviceInterfaceImpl is null!"); - } + Object service = resolver.resolve(serviceClass, interfaceClass);//this.applicationContext.getBean(serviceClass); try { - Method method = resolveMethodFromClass(serviceInterfaceImpl.getClass(), request.getMethod()); - Object result = method.invoke(serviceInterfaceImpl, request.getParams()); // dubbo, fastjson, + Method method = resolveMethodFromClass(service.getClass(), request.getMethod()); + Object result = method.invoke(service, request.getParams()); // dubbo, fastjson, // 两次json序列化能否合并成一个 response.setResult(JSON.toJSONString(result, SerializerFeature.WriteClassName)); response.setStatus(true); diff --git a/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/DemoResolver.java b/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/DemoResolver.java index 70d3aa40..73e28072 100644 --- a/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/DemoResolver.java +++ b/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/DemoResolver.java @@ -1,85 +1,20 @@ package io.kimmking.rpcfx.demo.provider; -import java.io.File; -import java.io.IOException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.List; - import io.kimmking.rpcfx.api.RpcfxResolver; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; -public class DemoResolver implements RpcfxResolver { +public class DemoResolver implements RpcfxResolver, ApplicationContextAware { - private final String IMPL_PACKAGE = "io.kimmking.rpcfx.demo.provider"; + private ApplicationContext applicationContext; @Override - public Class resolve(String serviceClass) { - - Class interfaceClass = null; - try { - interfaceClass = Class.forName(serviceClass); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } - - List> allClasses = getAllClassByPatch(IMPL_PACKAGE); - - List> classList = new ArrayList<>(); - for (int i = 0; i < allClasses.size(); i++) { - - //判断是不是同一个接口 - if (interfaceClass.isAssignableFrom(allClasses.get(i))) { - if (!interfaceClass.equals(allClasses.get(i))) { - classList.add(allClasses.get(i)); - } - } - } - - return classList.get(0); - } - - private List> getAllClassByPatch(String implPackage) { - ArrayList> list = new ArrayList<>(); - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - String path = implPackage.replace('.', '/'); - try { - ArrayList fileList = new ArrayList<>(); - Enumeration enumeration = classLoader.getResources(path); - while (enumeration.hasMoreElements()) { - URL url = enumeration.nextElement(); - fileList.add(new File(url.getFile())); - } - for (int i = 0; i < fileList.size(); i++) { - list.addAll(findClass(fileList.get(i),implPackage)); - } - } catch (IOException e) { - e.printStackTrace(); - } - return list; + public void setApplicationContext(ApplicationContext applicationContext) { + this.applicationContext = applicationContext; } - private static ArrayList> findClass(File file,String packagename) { - ArrayList> list = new ArrayList<>(); - if (!file.exists()) { - return list; - } - File[] files = file.listFiles(); - for (File file2 : files) { - if (file2.isDirectory()) { - assert !file2.getName().contains(".");//添加断言用于判断 - ArrayList> arrayList = findClass(file2, packagename+"."+file2.getName()); - list.addAll(arrayList); - }else if(file2.getName().endsWith(".class")){ - try { - //保存的类文件不需要后缀.class - list.add(Class.forName(packagename + '.' + file2.getName().substring(0, - file2.getName().length()-6))); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } - } - } - return list; + @Override + public T resolve(String serviceClass,Class type) { + return this.applicationContext.getBean(serviceClass,type); } } diff --git a/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/RpcfxServerApplication.java b/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/RpcfxServerApplication.java index e3a27cd4..bb369255 100644 --- a/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/RpcfxServerApplication.java +++ b/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/RpcfxServerApplication.java @@ -87,12 +87,12 @@ public RpcfxResolver createResolver(){ // annotation - @Bean//(name = "io.kimmking.rpcfx.demo.api.UserService") + @Bean(name = "io.kimmking.rpcfx.demo.api.UserService") public UserService userService(){ return new UserServiceImpl(); } - @Bean//(name = "io.kimmking.rpcfx.demo.api.OrderService") + @Bean(name = "io.kimmking.rpcfx.demo.api.OrderService") public OrderService orderService(){ return new OrderServiceImpl(); } From 63ca456b2d0be9e9bae04f719112936e7fdb0c3f Mon Sep 17 00:00:00 2001 From: pingxiangdong Date: Tue, 5 Oct 2021 01:48:46 +0800 Subject: [PATCH 9/9] =?UTF-8?q?3.=E5=BF=85=E5=81=9A=EF=BC=8C=E7=AC=AC?= =?UTF-8?q?=E4=B8=89=E6=AD=A5=EF=BC=9A=E5=B0=9D=E8=AF=95=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=20Netty+HTTP=20=E4=BD=9C=E4=B8=BA=20client=20=E7=AB=AF?= =?UTF-8?q?=E4=BC=A0=E8=BE=93=E6=96=B9=E5=BC=8F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gateway/client/HttpClientHandler.java | 2 +- .../gateway/client/HttpClientTest.java | 2 +- .../gateway/client/NettyClientTest.java | 3 +- 07rpc/rpc01/rpcfx-core/pom.xml | 22 +++++++ .../rpcfx/client/HttpClientHandler.java | 60 +++++++++++++++++++ .../io/kimmking/rpcfx/client/NettyClient.java | 54 +++++++++++++++++ .../java/io/kimmking/rpcfx/client/Rpcfx.java | 17 +++--- .../demo/consumer/RpcfxClientApplication.java | 15 ++--- .../demo/consumer/aop/ProxyInterceptor.java | 44 ++++++++++++++ .../demo/provider/RpcfxServerApplication.java | 2 + 10 files changed, 202 insertions(+), 19 deletions(-) create mode 100644 07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/client/HttpClientHandler.java create mode 100644 07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/client/NettyClient.java create mode 100644 07rpc/rpc01/rpcfx-demo-consumer/src/main/java/io/kimmking/rpcfx/demo/consumer/aop/ProxyInterceptor.java diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/HttpClientHandler.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/HttpClientHandler.java index 5958a762..694ad881 100644 --- a/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/HttpClientHandler.java +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/HttpClientHandler.java @@ -23,7 +23,7 @@ public void channelActive(ChannelHandlerContext ctx) throws Exception { public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { System.out.println("msg ->" + msg); - if (msg instanceof FullHttpRequest) { + if (msg instanceof FullHttpResponse) { FullHttpResponse response = (FullHttpResponse) msg; ByteBuf buf = response.content(); String result = buf.toString(CharsetUtil.UTF_8); diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/HttpClientTest.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/HttpClientTest.java index 403936c0..45e9dce3 100644 --- a/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/HttpClientTest.java +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/HttpClientTest.java @@ -31,7 +31,7 @@ private static void httpGet() throws IOException { client = HttpClients.createDefault(); - get = new HttpGet("http://localhost:8888"); + get = new HttpGet("http://localhost:8801"); response = client.execute(get); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { HttpEntity entity = response.getEntity(); diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/NettyClientTest.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/NettyClientTest.java index 17cbf556..f79ea62c 100644 --- a/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/NettyClientTest.java +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/client/NettyClientTest.java @@ -30,6 +30,7 @@ protected void initChannel(Channel ch) throws Exception { }); ChannelFuture future = b.connect(host, port).sync(); + ChannelFuture channelFuture = future.channel().closeFuture().sync(); } catch (InterruptedException e) { @@ -42,7 +43,7 @@ protected void initChannel(Channel ch) throws Exception { } public static void main(String[] args) { - start("localhost",8888); + start("localhost",8801); } } diff --git a/07rpc/rpc01/rpcfx-core/pom.xml b/07rpc/rpc01/rpcfx-core/pom.xml index 4570a59d..ef5434d3 100644 --- a/07rpc/rpc01/rpcfx-core/pom.xml +++ b/07rpc/rpc01/rpcfx-core/pom.xml @@ -70,6 +70,28 @@ + + + org.springframework + spring-aop + + + + org.aspectj + aspectjrt + + + + org.aspectj + aspectjweaver + + + + io.netty + netty-all + 4.1.45.Final + + diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/client/HttpClientHandler.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/client/HttpClientHandler.java new file mode 100644 index 00000000..40d45e5c --- /dev/null +++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/client/HttpClientHandler.java @@ -0,0 +1,60 @@ +package io.kimmking.rpcfx.client; + +import java.net.URI; +import java.nio.charset.StandardCharsets; + +import com.alibaba.fastjson.JSON; + +import io.kimmking.rpcfx.api.RpcfxRequest; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.handler.codec.http.DefaultFullHttpRequest; +import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.handler.codec.http.HttpHeaderNames; +import io.netty.handler.codec.http.HttpHeaderValues; +import io.netty.handler.codec.http.HttpMethod; +import io.netty.handler.codec.http.HttpVersion; +import io.netty.util.CharsetUtil; + +public class HttpClientHandler extends ChannelInboundHandlerAdapter { + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + + URI uri = new URI("/"); + + RpcfxRequest parameters = new RpcfxRequest(); + parameters.setServiceClass("io.kimmking.rpcfx.demo.api.UserService"); + parameters.setMethod("findById"); + + Object[] params = new Object[1]; + params[0] = 1; + parameters.setParams(params); + + String content = JSON.toJSONString(parameters); + + FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_0, HttpMethod.POST, uri.toASCIIString(), + Unpooled.wrappedBuffer(content.getBytes(StandardCharsets.UTF_8))); + request.headers().add(HttpHeaderNames.CONNECTION,HttpHeaderValues.KEEP_ALIVE); + request.headers().add(HttpHeaderNames.CONTENT_LENGTH,request.content().readableBytes()); + request.headers().add(HttpHeaderNames.CONTENT_TYPE,"application/json; charset=utf-8"); + + ctx.writeAndFlush(request); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + System.out.println("msg ->" + msg); + + if (msg instanceof FullHttpResponse) { + FullHttpResponse response = (FullHttpResponse) msg; + ByteBuf buf = response.content(); + String result = buf.toString(CharsetUtil.UTF_8); + System.out.println("response -> " + result); + + } + } +} diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/client/NettyClient.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/client/NettyClient.java new file mode 100644 index 00000000..2d630b38 --- /dev/null +++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/client/NettyClient.java @@ -0,0 +1,54 @@ +package io.kimmking.rpcfx.client; + +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.codec.http.HttpClientCodec; +import io.netty.handler.codec.http.HttpContentDecompressor; +import io.netty.handler.codec.http.HttpObjectAggregator; + +public class NettyClient { + + public static String start(String host, int port){ + + EventLoopGroup group = new NioEventLoopGroup(); + ChannelFuture future = null; + try { + Bootstrap b = new Bootstrap(); + b.group(group) + .channel(NioSocketChannel.class) + .option(ChannelOption.SO_KEEPALIVE,true) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(Channel ch) throws Exception { + ch.pipeline().addLast(new HttpClientCodec()); + ch.pipeline().addLast(new HttpObjectAggregator(65536)); + ch.pipeline().addLast(new HttpContentDecompressor()); + ch.pipeline().addLast(new HttpClientHandler()); + } + }); + + future = b.connect(host, port).sync(); + ChannelFuture channelFuture = future.channel().closeFuture().sync(); + + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + System.out.println("关闭线程组"); + group.shutdownGracefully(); + } + + return ""; + } + + public static void main(String[] args) { + String result = start("localhost", 8080); + System.out.println("the result:"+result); + } + +} diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/client/Rpcfx.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/client/Rpcfx.java index 5d1ae517..fa5c0958 100644 --- a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/client/Rpcfx.java +++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/client/Rpcfx.java @@ -94,20 +94,19 @@ public Object invoke(Object proxy, Method method, Object[] params) throws Throwa return JSON.parse(response.getResult().toString()); } - private RpcfxResponse post(RpcfxRequest req, String url) throws IOException { + private RpcfxResponse post(RpcfxRequest req, String url) { String reqJson = JSON.toJSONString(req); System.out.println("req json: "+reqJson); // 1.可以复用client // 2.尝试使用httpclient或者netty client - OkHttpClient client = new OkHttpClient(); - final Request request = new Request.Builder() - .url(url) - .post(RequestBody.create(JSONTYPE, reqJson)) - .build(); - String respJson = client.newCall(request).execute().body().string(); - System.out.println("resp json: "+respJson); - return JSON.parseObject(respJson, RpcfxResponse.class); + String[] hostAndPort = url.split(":"); + if (hostAndPort.length == 2) { + String result = NettyClient.start(hostAndPort[0], Integer.parseInt(hostAndPort[1])); + return JSON.parseObject(result, RpcfxResponse.class); + } + + return null; } } } diff --git a/07rpc/rpc01/rpcfx-demo-consumer/src/main/java/io/kimmking/rpcfx/demo/consumer/RpcfxClientApplication.java b/07rpc/rpc01/rpcfx-demo-consumer/src/main/java/io/kimmking/rpcfx/demo/consumer/RpcfxClientApplication.java index a4187d14..e82c96b5 100644 --- a/07rpc/rpc01/rpcfx-demo-consumer/src/main/java/io/kimmking/rpcfx/demo/consumer/RpcfxClientApplication.java +++ b/07rpc/rpc01/rpcfx-demo-consumer/src/main/java/io/kimmking/rpcfx/demo/consumer/RpcfxClientApplication.java @@ -1,21 +1,22 @@ package io.kimmking.rpcfx.demo.consumer; +import java.util.List; + +import javax.annotation.Resource; + import io.kimmking.rpcfx.api.Filter; import io.kimmking.rpcfx.api.LoadBalancer; import io.kimmking.rpcfx.api.Router; import io.kimmking.rpcfx.api.RpcfxRequest; import io.kimmking.rpcfx.client.Rpcfx; -import io.kimmking.rpcfx.demo.api.Order; -import io.kimmking.rpcfx.demo.api.OrderService; import io.kimmking.rpcfx.demo.api.User; import io.kimmking.rpcfx.demo.api.UserService; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.EnableAspectJAutoProxy; -import java.util.List; -import java.util.Random; - -@SpringBootApplication +@SpringBootApplication(scanBasePackages = "io.kimmking") +@EnableAspectJAutoProxy public class RpcfxClientApplication { // 二方库 @@ -28,7 +29,7 @@ public static void main(String[] args) { // UserService service = new xxx(); // service.findById - UserService userService = Rpcfx.create(UserService.class, "http://localhost:8080/"); + UserService userService = Rpcfx.create(UserService.class, "localhost:8080"); User user = userService.findById(1); System.out.println("find user id=1 from server: " + user.getName()); diff --git a/07rpc/rpc01/rpcfx-demo-consumer/src/main/java/io/kimmking/rpcfx/demo/consumer/aop/ProxyInterceptor.java b/07rpc/rpc01/rpcfx-demo-consumer/src/main/java/io/kimmking/rpcfx/demo/consumer/aop/ProxyInterceptor.java new file mode 100644 index 00000000..ec2ecf5d --- /dev/null +++ b/07rpc/rpc01/rpcfx-demo-consumer/src/main/java/io/kimmking/rpcfx/demo/consumer/aop/ProxyInterceptor.java @@ -0,0 +1,44 @@ +package io.kimmking.rpcfx.demo.consumer.aop; + +import java.lang.reflect.Method; + +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.core.Ordered; +import org.springframework.stereotype.Component; + +/** + * @author by 平向东 + * @date 2021/10/3 11:26 Copyright 2021 北京交个朋友数码科技有限公司. All rights reserved. + */ +@Component +@Aspect +@Slf4j +public class ProxyInterceptor implements Ordered { + + //@Around("execution(* com.company.controller.*.*(..))") + @Around("execution(* io.kimmking.rpcfx.demo.api.UserService.findById(..))") + public Object around(ProceedingJoinPoint point) throws Throwable { + + log.error("enter around"); + + MethodSignature signature = (MethodSignature)point.getSignature(); + Method method = signature.getMethod(); + + try { + return point.proceed(); + }catch (Exception e){ + e.printStackTrace(); + } + + return null; + } + + @Override + public int getOrder() { + return 1; + } +} diff --git a/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/RpcfxServerApplication.java b/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/RpcfxServerApplication.java index bb369255..0c33629e 100644 --- a/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/RpcfxServerApplication.java +++ b/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/RpcfxServerApplication.java @@ -13,6 +13,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @@ -21,6 +22,7 @@ @SpringBootApplication @RestController +@EnableAspectJAutoProxy public class RpcfxServerApplication { public static void main(String[] args) throws Exception {