websocket loadbalancing on google cloud

วิธีสร้าง websocket loadbalancing บน google cloud

ไปที่เมนู Network services >>> Load balancing >>> Create a load balancer >>> TCP Load Balancing

จากนั้นกดปุ่ม Continue

ที่ Frontend Configuration : สร้าง public ip address สำหรับ load balance

ที่ Backend Configuration : ให้เลือกเครื่องที่จะอยู่หลัง load balance

หากเราสร้าง Load balance เป็นประเภท HTTP(S) Load balancing จะทำให้พบปัญหา Websocket client ที่ต่ออยู่กับ Web socket server ด้วย ip loadbalance ถูกตัด connection อยู่ตลอด แต่หากจำเป็นต้องทำ HTTPS ก็ใช้ได้ ให้เขียน Web Socket Client auto reconnect เอาทุกๆช่วงเวลาหนึ่ง เช่นทุกๆ 30 วิ

Posted in technology, websocket | Leave a comment

STOMP Websocket ด้วย stomp-js + sockjs

STOMP ย่อมาจาก Simple (or Streaming) Text Orientated Messaging Protocol ใช้สื่อสารส่งข้อมูลกัน ต้อง implement ทั้ง STOMP SERVER และ STOMP Client

โดยปกติแล้วการสร้าง STOMP Client จะใช้ Web Socket class ในการเชื่อมต่อด้วย Web Socket Protocol ws:// ดังตัวอย่าง

var url = "ws://localhost:port/entryURI";
var client = Stomp.client(url);

แต่ในบาง Web Browser ไม่ support Web Socket protocol ws:// แล้ว จึงต้องใช้ SockJS มาช่วยแก้ปัญหานี้ และถือเป็นข้อดีของมัน โดยจะใช้ URL แทน ws://

var ws = new SockJS(url);
var client = Stomp.over(ws);

ตัวอย่าง STOMP Client

1. โหลด js ของ stompjs กับ sockjs โดยใช้ CDN url ควรตรวจสอบ latest version

<script src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sockjs-client@1/dist/sockjs.min.js"></script>

2. ต่อ websocket connection และดักฟัง subscribe channel โดยในตัวอย่างนี้ url ในการเชื่อมต่อ คือ http://localhost:port/socket

var ws = new SockJS(url);
var client = Stomp.over(ws);
    client.connect({}, function(frame) {
      var userid= Math.floor((Math.random() * 100) + 1);
      client.subscribe("/channel"+userid, (message) => {
        if(message.body) {
          console.log(message.body);
        }
    });
 });

3. ส่งข้อมูล (send) ไปหา websocket server

client.send("/app/send/message", {}, qrcode);

ตัวอย่าง STOMP Server ด้วย Spring Boot

1.เพิ่ม spring-boot-starter-websocket dependency ที่ pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

2.สร้างไฟล์ WebSocketConfiguration โดย URL ในการเชื่อมต่อจาก Stomp Client ของ Web Socket ในตัวอย่างจะเป็น http://localhost:port/socket และเปิดช่องการสื่อสาร 2 ช่อง คือ global-channel สำหรับสื่อสารถึงทุกคน และ channel สำหรับสื่อสาร 1-1

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/socket")
                .setAllowedOrigins("*")
                .withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.setApplicationDestinationPrefixes("/app") //prefix channel
                .enableSimpleBroker("/global-channel");//The “/global-channel” channel defining;
                .enableSimpleBroker("/channel");//The “/channel” channel defining;
    }
}

3.สร้าง RestController เทสการส่งข้อมูลผ่าน Web Socket โดย @MessageMapping จะทำงานเมื่อ Stomp Client มีการส่งข้อมูลผ่าน javascript object ด้วย method send โดยจะส่งข้อมูล broadcast ออกไปให้ global-channel ส่วน @RequestMapping จะเป็น Rest เรียกมาจาก URL method GET จะทำการส่งข้อมูล broadcast 1 ต่อ 1 ไปให้ userid ที่ส่งเข้ามา

@RestController
public class WebSocketController {

    private final SimpMessagingTemplate template;

    @Autowired
    WebSocketController(SimpMessagingTemplate template){
        this.template = template;
    }

    //The same as @RequestMapping for RestController we need to use @MessageMapping for websockets.
    @MessageMapping("/send/message")
    public void onReceivedMessage(String message){
        this.template.convertAndSend("/global-channel",new SimpleDateFormat("HH:mm:ss").format(new Date())+"- "+message);
    }

    @RequestMapping(value = "/rest/send/message",  method = { RequestMethod.GET})
    public @ResponseBody
    String testsend( @RequestParam Map<String,String> allRequestParams,HttpServletRequest httpRequest) throws Exception {
     
        String userid= allRequestParams.get("userid");
        this.template.convertAndSend("/channel/"+userid, "send message " + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "<br>");
        return "OK";
    }

}
Posted in java, knowledge, spring boot, websocket | Leave a comment

spring boot upgrade version 1.5.x to 2.0.0 GA

แชร์ประสบการณ์อัพเกรดโปรเจ็คที่ใช้ spring boot 1.5.x ไปใช้ 2.0.0 GA แต่ละงานอาจจะต้องแก้ไขต่างกัน ขึ้นกับ dependency ที่ใช้งาน

1. แก้ไข spring-boot-starter-parent

org.springframework.boot
spring-boot-starter-parent
2.0.0.RELEASE

<!-- lookup parent from repository -->

2. ถ้าใช้ HikariCP อยู่แล้ว ให้ลบออกเพราะ spring boot 2.0.0 เปลี่ยนจาก Tomcat Pool มาเป็น HikariCP โดย default
3. ถ้าใช้ com.fasterxml.jackson.core ให้อัพเดทเป็น version ล่าสุด ในบทความนี้คือ 2.9.0

<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.0</version>
            <scope>provided</scope>
        </dependency>

4. Spring boot 2.0 disable default security ให้ใส่โค้ดไปปิดหน้า login ออก

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
public class SecurityConfig  extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable().authorizeRequests().anyRequest().permitAll();
    }
}

reference https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes

Posted in spring boot | Leave a comment

android map host เพื่อใช้ทำเทสยังไง

ใครที่กำลังมองหาวิธี map host บน android โดยไม่ต้อง root เครื่องมือถือของตัวเอง ให้ทำตามขั้นตอนดังนี้ โดยเราจะใช้โปรแกรม Nox App Player เป็นตัว android emulator เพราะสามารถ Root เครื่องได้เพียงคลิกเดียว

  1. Root เครื่อง โดยคลิกที่รูปฟันเฟืองมุมขวาบน และติ๊กที่หน้า บูท รูท
  2. เข้า ES File Explorer คลิกที่เมนู hamburger(มุมซ้ายบน) เปิดการใช้งาน Root Explorer ก่อน จากนั้นให้กดไปที่ / และเข้าไปแก้ไขไฟล์ /system/etc/host (หากสามารถ map ได้เพียงบรรทัดเดียว ให้เคาะ enter เว้นบรรทัดตรงบรรทัดสุดท้ายเสมอ
  3. การตรวจสอบ ip ว่าเราแมฟโฮสต์สำเร็จหรือไม่ เข้า Google Play Store ให้โหลดโปรแกรม Ping มาใช้งาน

คราวหน้าเราจะมาใช้ burp suite scanner เพื่อจับ snip request ต่างๆจากมือถือ เหมาะสำหรับ Tester มากๆ

Posted in knowledge | Leave a comment

ลดโอกาสเสี่ยงเว็บล่ม ด้วยการใส่เกมพนันลงบนแอพฯมือถือ

ทุกวันนี้การเข้าใช้งานในด้านต่าง ๆ บนโทรศัพท์มือถือดูจะเป็นเรื่องธรรมดาของผู้คนในยุคนี้ไปแล้ว เราสามารถใช้เจ้าสิ่งนี้ในการเล่นเกม ดูทีวีย้อนหลัง ทำธุรกรรมทางการเงิน รวมไปถึงเล่นพนันออนไลน์ก็สามารถทำได้ เพียงแค่เข้าไปที่เว็บไซต์ที่เป็นแหล่งสำหรับลงเดิมพัน หรือบางแห่งที่สามารถดาวน์โหลดแอพพลิเคชันมาติดตั้งบนมือถือของเราเอง เพื่อใช้สำหรับเข้าไปเล่นเกมพนันออนไลน์ได้ทุกเวลาที่ต้องการ
อย่างเช่นในเว็บ SCR888 ไทยก็จะมีช่องทางดาวน์โหลดที่รองรับการใช้งานบนมือถือโดยเฉพาะ สามารถใช้ได้ทั้งระบบ iOS และ Android อย่างไรก็ตามข้อดีที่เกี่ยวกับความสะดวกในการเข้าไปเล่นแล้ว การเข้าใช้ผ่านแอพฯยังช่วยลดความเสี่ยงต่อการเจอปัญหาเว็บล่มด้วย
ถึงแม้หลาย ๆ เว็บจะเตรียมทางเข้าสำหรับเข้าไปเล่นในคาสิโนออนไลน์ไว้หลายช่องทาง แต่บางครั้งก็อาจเกิดปัญหาลิงค์เสียบวกกับเจอ Google Bot ถล่มซ้ำในทางเข้าอื่นจากการที่ลิงค์นั้นมี index มากเกินไปเพียงเล็กน้อย จนก่อให้เกิดปัญหาเว็บล่ม ถึงแม้ว่าเราจะทำการตั้งค่าโดยเข้าไปปรับค่า Crawl Rate ไว้แล้วก็ตาม หรือเติมโค้ด rel=nofollow ลงในจุด tag แต่ก็ช่วยได้ดีในระดับนึง ดังนั้นเว็บที่เป็นแหล่งเล่นพนันออนไลน์จึงมองหาช่องทางอื่นเพื่อให้การเข้าใช้งานสามารถได้รับความไว้วางใจจากผู้ใช้งานได้มากกว่า
นอกจากปัญหาเว็บล่มที่อาจเกิดขึ้นได้นั้น การพัฒนาแอพฯสำหรับเล่นเกมบนมือถือยังถือเป็นการตอบสนองให้ตรงกับไลฟ์สไตล์ของผู้บริโภคในยุคนี้ ที่ต้องการมีตัวเลือกในการเปิดรับข้อมูลให้ได้หลายทาง แล้วก็ตรงกับสิ่งที่กำลังต้องการในเวลานั้นมากที่สุดด้วย อย่างเช่นหลายคนเข้าใช้งานผ่านคอมพิวเตอร์อยู่ พอได้เข้าไปเล่นเกมพนันในช่องทางนี้ก็จะเห็นเนื้อหาต่าง ๆ ได้ง่ายและชัดเจนกว่า แต่บางเวลาก็สะดวกที่จะใช้มือถือมากกว่าในการเข้าใช้งาน ซึ่งมีคนไม่น้อยเลยที่ชอบในการมีตัวเลือกให้พวกเขาได้เลือกเข้าใช้ได้มากกว่า 1 ทาง ซึ่งมีผลต่อการตัดสินใจในการเลือกแหล่งที่ต้องการเข้าไปใช้บริการอยู่พอสมควร

Posted in ไม่มีหมวดหมู่ | Leave a comment