Introduction
In recent releases the Websockets function has been added as a capability to both WebLogic 12.1.2 and Oracle Traffic Director (11.1.1.7.0). This blog posting is another courtesy of my colleague Mark Mundy who has been doing some investigation into what is involved to setup an architecture with a browser accessing a web application running websockets on WebLogic and proxied/load balanced through OTD.The WebLogic documentation covers the setup of Websockets at the server side and the OTD documentation explains what is needed for the load balancer. This blog posting is intended to show how the two can be used together on the latest Exalogic virtualised release to have OTD load balance a simple example websocket application with relative ease. This posting will not go through every aspect of the setup as the assumption is that the reader has some familiarity with Exalogic Control, WebLogic and OTD. The example application being used is the one that ships as part of the example set for WebLogic 12.1.2 with a slight modification as will be highlighted.
The deployment topology that is used in this scenario is shown below.
WebSocket deployment Topology - Browser --> OTD Load Balancer --> Application(WLS Cluster) |
Setting up the Exalogic Environment
Depending on how complex you want to make the environment, will determine what needs to be set up. In order to demonstrate the basic load balancing while ensuring that there is no direct network connectivity between the client browser and the back end WLS managed server hosting the websocket application, a minimum of 2 vServers would be needed. In order to test out features such as load balancing during failure scenarios at both WLS and OTD ideally 5 would be created. For this example it will be assuming 5 vServers are created and the topology reflected in the following diagram shows the networking setup.
WebLogic Installation and Configuration
WebLogic 12.1.2 is the minimum version that can be used for Websocket support, select the 12c Generic Download from the Oracle download site. (This will have a dependency on the latest 64bit java version so if not already installed on your vServers then install prior to installing WLS.)Install the Complete Installation of WLS 12.1.2 using the installed 64 bit Java 7. Installing the complete installation will ensure the example applications are available and it is the Websockets example that will be used. Once WLS is installed complete the post installation configuration to ensure this happens. For more details on getting the examples available see this link
The specific websockets example application used in this document will be introduced after a specific WLS domain is created to host it.
Rather than use the WLS examples domain a new domain will be used so as to keep things as simple as possible but at the same time allowing the ability to have more flexibility in the testing. Further detail about the WLS implementation is available in the documentation.
A new WLS domain needs to be created using the domain wizard. In the topology shown above the two instances in a cluster that listen on the private vNet and the administration server uses this network as the default but also has an additional HTTP channel setup to listen on the EoIB public network so that administration becomes simple from outside the Exalogic rack. The websocket application can then be deployed to the cluster such that is is only accessible to the client population through the OTD tier, providing a level of security.
The example that ships with WebLogic will only work in the scenario where the browser and WLS managed server are both on the same host. To resolve this issue we make a small change to the code in the example before building the application and deploying to the cluster. In the example source code identify exampleScript.js and change the line that opens up the websocket.
This Javascript file is normally located in:-
<WLS_Home>/user_projects/applications/wl_server/examples/src/examples/webapp/html5/webSocket/src/main/webapp/script
Use your editor of choice and search for "localhost:7001" and replace it with " + window.location.host +" as shown below.
... if (ws == null) { ws = new WebSocket("ws://localhost:7001/webSocket/ws"); ws.onopen = function() { addMsg("Server Msg: WebSocket has been started."); }; ... becomes ... if (ws == null) { //ws = new WebSocket("ws://localhost:7001/webSocket/ws"); ws = new WebSocket('ws://' + window.location.host + '/webSocket/ws'); ws.onopen = function() { addMsg("Server Msg: WebSocket has been started."); }; ... |
The directory <WLS_Home>/user_projects/applications/wl_server/examples/src/examples/webapp/html5/webSocket contains full instructions on building and deploying the application. In our case we only need to re-build the application (ant build) and then use the standard WLS admin console (or WLST or ant if you prefer) to deploy the war file created to the WebLogic Cluster.
Oracle Traffic Director Installation and Configuration
For Websocket support we need to ensure that we install OTD 11.1.1.7.0 or higher. In our scenario we will install OTD onto the admin vServer and the two OTD instance vServers to end up with an HA cluster hosted on the two instance vServers that will route requests through to the backend WLS cluster. It is useful to enable monitoring on OTD so that we can easily spot the sessions being created in OTD and through to the back end WLS instances. To enable monitoring highlight the virtual server and enable the plain text report. As shown below.Enable plain text monitoring in OTD |
Websocket support is enabled by default in OTD so there is nothing else other than the deployment of the configuration to the cluster before we test out our Websocket application. However for information if there is a desire to disable websockets for a particular route then this can be achieved via the enable/disable of the "WebSocket Upgrade" for a given route.
Enable/Disable Websocket support in OTD. |
With the monitoring in place it is then possible to access the plain text report by accessing the URI http://OTD IP address:port/.perf where the Origin Server statistics are of particular interest. As highlighted below.
Testing the application
In another browser session/tab it is then possible to access the OTD instance with the URN /websocket. You can then click the start button to open up the socket and enter text to send to the server. Currently you should use either Chrome or Firefox but not Internet Explorer as it does not support websockets.WLS WebSocket example application |
By starting up additional browser sessions you can create multiple websockets and the .perf output will reflect the load balancing to the back end WLS instances.
In this example we can see that 3 websocket sessions have been created and they have been load balanced round the two available WLS server instances.
Behind the scenes what is actually happening is that there are two socket connections created for each WebSocket. The first is between the client browser and the OTD instance and the second from OTD to the WLS instances. OTD acts to bridge the gaps between the two. Below is the output from netstat on the OTD instance to show these socket connections.
Browser to OTD instance. # netstat -an Active Connections Proto Local Address Foreign Address State TCP 138.3.32.68:52732 138.3.49.9:8080 ESTABLISHED & OTD to WLS # netstat -an | grep 7003 tcp 0 0 192.168.16.74:39223 192.168.16.71:7003 ESTABLISHED |
The nature of establishing multiple sockets to link the load balancer to the back end service means that in the event of a failure by either OTD or WLS then the socket connection will be broken and the client must re-establish the socket again. Thus for HA connections there is a dependency on the client capturing any exceptions and re-establishing the connection.
Note:- If OTD is setup with a failover group (HA config) then one instance is primary and the second acts as a backup. Should the primary fail then the websocket would have to be re-established using the backup OTD instance. Once the primary is available again OTD will automatically fail back which will again break the websocket connection.
Thanks for the information; I was unable to make a wss:// connection but could make a ws:// connection through OTD, can I assume that 11.1.7.0 only supports non-secure websockets?
ReplyDelete