面接:クラスタ導入時の分散セッションの実現方法

4802 ワード

面接問題
クラスタ導入時の分散セッションはどのように実現しますか?
面接官の心理分析
面接官はあなたにdubboがどのように游んでいるのかを闻いて、あなたはdubboを游ぶことができて単一のシステムを分布式システムにすることができて、それから分布式の后ろから次から次へと多くの问题が来て、最大の问题は分布式の事务、インタフェースのべき乗など性、分布式のロックで、そして最后の1つは分布式のsessionです.
もちろん、分散システムの問題はそれだけでなく、非常に多く、複雑度が高いですが、ここではよくあることをいくつか言って、面接の時によく聞くことです.
面接問題の分析
sessionって何?ブラウザにはクッキーがあり、しばらくの間このクッキーが存在し、要求を出すたびに特殊なjsessionid cookieを持ってきます.これによって、サービス側で対応するセッションドメインを維持することができ、データを入れることができます.
一般的にブラウザをオフにしていない限り、クッキーはまだあるので、対応するセッションはありますが、クッキーがなくなったら、セッションもなくなります.何かのカートのようなもの、登録状態保存のようなものによく見られます.
これはあまり言わないで、Javaを知っている人はこれを知っているはずです.
単一のシステムの时はこのようにsessionを游んで大丈夫で、しかしあなたは分布式のシステムならば、そんなに多くのサービス、sessionの状态はどこでメンテナンスしますか?
実は方法はたくさんありますが、よく使われるのは以下のいくつかです.
セッションは全く使いません
JWT Tokenを使用してユーザーIDを保存し、データベースまたはcacheから他の情報を取得します.これにより、リクエストがどのサーバに割り当てられても構いません.
tomcat + redis
これは実はとても便利で、sessionのコードを使って、以前と同じようにtomcatのオリジナルのsessionに基づいてサポートすればいいです.それからTomcat RedisSessionManagerというものを使って、私たちが配置したtomcatすべてにsessionデータをredisに保存させます.
tomcatのプロファイルで構成するには、次の手順に従います.




そしてredisのhostとportを指定すればOKです.



また、redis哨兵がサポートするredis高利用クラスタに基づいてsessionデータを保存することもでき、okである.
spring session + redis
1つ目の方法はtomcatコンテナと再結合されます.もし私がwebコンテナをjettyに移行するなら、jettyを再構成しますか?
上のtomcat+redisの方法は使いやすいですが、webコンテナに大きく依存し、コードを他のwebコンテナに移植するのはよくありません.特に技術スタックを交換したらどうしますか.例えばspring cloudとかspring bootとかに変えましたか?
だから今のほうがいいのはJavaワンストップソリューション、つまりspringです.人のspringは基本的に私たちが使うフレームワークの大部分を包んで、spirng cloudはマイクロサービスをして、spring bootは足場をして、だからsping sessionを使うのは1つのとても良い選択です.
pom.xmlでの構成:

  org.springframework.session
  spring-session-data-redis
  1.2.1.RELEASE


  redis.clients
  jedis
  2.8.1


スプリングプロファイルで構成するには、次の手順に従います.

    



    
    



    
    
    
    
    
    


Web.xmlでの構成:

    springSessionRepositoryFilter
    org.springframework.web.filter.DelegatingFilterProxy


    springSessionRepositoryFilter
    /*


サンプルコード:
@Controller
@RequestMapping("/test")
public class TestController {

    @RequestMapping("/putIntoSession")
    @ResponseBody
    public String putIntoSession(HttpServletRequest request, String username) {
        request.getSession().setAttribute("name",  “leo”);

        return "ok";
    }

    @RequestMapping("/getFromSession")
    @ResponseBody
    public String getFromSession(HttpServletRequest request, Model model){
        String name = request.getSession().getAttribute("name");
        return name;
    }
}

上のコードはokです.sping session構成にredisに基づいてsessionデータを格納し、spring sessionのフィルタを構成します.そうすると、session関連操作はspring sessionに任せられます.次にコードでは,オリジナルのセッションで動作し,springセッションに直接基づいてredisからデータを取得する.
分散型のセッションを実現するには多くの方法がありますが、私が言ったのは比較的一般的ないくつかの方法にすぎません.tomcat+redisは初期によく使われていましたが、tomcatに再結合されます.近年、spring sessionによって実現されている.