Jersey +jetty 實現微服務(一)


微服務:

   傳輸協議基本都是http,數據序列化,協議層目前protocol bufferJson, xml,Java序列化,最多使用Json。實現以上二點並不難,spring 就可以,但spring 的初衷是為了搞一套簡化web開發,微服務最大特點,快速開發,持續交付,快速部署,

   Jersey+Jetty ,正是符合這個特點。

Jersey

    Jersey RESTful 框架是開源的RESTful框架, 實現了 JAX-RS 規范。它擴展了JAX-RS 參考實現, 提供了更多的特性和工具, 可以進一步地簡化 RESTful service client 開發。

  

 1 @Path("/base")
 2 public class BaseServer  {
 3 
 4 
 5     @Path("/add")
 6     @GET
 7     @Produces(MediaType.TEXT_PLAIN)
 8     @Override
 9     public String add(@QueryParam("x") int x, @QueryParam("y") int y) {
10         return "" + (x + y);
11     }
12 }
View Code

 

Jetty:

   Jetty 是一個開源的servlet容器,項目可以不用打成war包,可以使用jetty這樣嵌入式的serlvet容器,它比tomcat更輕量 Jetty9支持最新NIO,不再支持BIO

   Jetty Server兩個重要的概念一個是Handler,一個是Connector。嵌入一個jetty服務一般會有下面幾步,創建Server,加載Connectors,加載handlers,加載Servlets等,啟動服務start,最后加入服務器join

    一個Jetty Server可以看成由一下幾部分組成,其中Connector負責接收客戶端的HTTP請求,請求的處理是由Handler來完成的。

    HandlerJetty中是一個非常重要的東西,Jetty內部實現了一些Handler,可以分為一下幾類:

    1.協調Handler:負責將request路由到其他HandlerHandler(如:HandlerConnection, ContextHandlerConnection

    2.過濾Handler:負責向request中設置一些參數,然后再把請求轉交給其他Handler(如:HandlerWapper, ContextHandler,        SessionHandler

    3.生成Handler:負責生成響應的內容(如:ResourceHandler, ServletHandler

    HandlerWrapper,AbstractHandler Server類就是實現HandlerWrapper,其它一些自定Handler通過繼承AbstractHandler實現

 

 

 1 public class HelloHandler extends AbstractHandler {
 2     public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
 3             throws IOException, ServletException {
 4         response.setContentType("text/html;charset=utf-8");
 5         response.setStatus(HttpServletResponse.SC_OK);
 6         baseRequest.setHandled(true);
 7         response.getWriter().println("<h1>Hello World1</h1>");
 8         response.getWriter().println("Request url: " + target);
 9     }
10 
11     public static void main(String[] args) throws Exception {
12         Server server = new Server();
13         ServerConnector serverConnector = new ServerConnector(server);
14         serverConnector.setPort(8031);
15         //ServletContextHandler servletContextHandler = new ServletContextHandler();
16         server.setHandler(new HelloHandler());
17         server.addConnector(serverConnector);
18         //servletContextHandler.addServlet(new ServletHolder(new HelloHandler()),"/hello");
19         server.start();
20         server.join();
21 
22     }
23 }
View Code

 

    ServerConnector 是Jetty 9 提供NIO方式

 Jsery+Jetty如何接合

    jsery中有一個類ServletContainer,它直接從HttpServlet繼承而來,直接插入Jetty ServletContextHandler.addServlet方法中。ServletContainer構造方法會要求注入一個實現Application類,這個類用來掃描包,它service方法攔截了全部請求,並把它轉向Jsery對應類方法中

  

 1 private static final ResourceConfig resourceConfig = new MyResourceConfig("com.test");
 2     public static void main(String[] args) throws Exception {
 3         Server server = new Server();
 4         ServerConnector serverConnector = new ServerConnector(server);
 5         serverConnector.setPort(8012);
 6         ServletContextHandler servletContextHandler = new ServletContextHandler();
 7 
 8         ServletContainer servletContainer = new ServletContainer(resourceConfig);
 9         server.addConnector(serverConnector);
10 
11         servletContextHandler.addServlet(new ServletHolder(servletContainer),"/*");
12         server.setHandler(servletContextHandler);
13         server.start();
14         server.join();
15 
16     }
17     @Path("/add")
18     @GET
19     @Produces(MediaType.TEXT_PLAIN)
20     public String add(@QueryParam("x") int x, @QueryParam("y") int y) {
21         return "" + (x + y);
22     }
View Code

 包掃描方式 使用jersey 注解包掃描類PackageNamesScanner

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM