Table des matières
Principe RPC
造轮子
框架使用" >框架使用
Maison Problème commun Le framework RPC manuscrit n'est vraiment pas seulement destiné à faire semblant d'avoir 13 ans !

Le framework RPC manuscrit n'est vraiment pas seulement destiné à faire semblant d'avoir 13 ans !

Aug 16, 2023 pm 05:01 PM
rpc框架

Lors de l'entretien, il est facile de se faire demander par l'intervieweur :

Comment concevoir un framework RPC ?

On ne vous l'a peut-être pas demandé, peut-être avez-vous de la chance, ou peut-être n'êtes-vous pas encore à ce niveau. Habituellement, le salaire mensuel est supérieur à 20 000 et ils poseront essentiellement des questions de conception.

Du point de vue de l'intervieweur : il vaut mieux poser ce type de questions que de poser un essai en huit parties, qui implique de nombreux points techniques. Par exemple : connaissances sur les modèles de conception, les protocoles de communication, les agents dynamiques, la virtualisation, les pools de threads, etc.

D’accord, n’allons pas trop loin, commençons par parler du sujet d’aujourd’hui.

RPC est un appel de procédure à distance. De nombreuses personnes ne comprennent peut-être pas particulièrement ces mots. Pour le dire simplement :

Appelez un service distant, tout comme appeler une méthode locale.

Par exemple, le cas suivant : un utilisateur exploitant un service :

1

2

3

4

5

6

7

8

9

10

public interface UserService{

    String findUserNameById(Integer userId);

}

@Service

public class UserServiceImpl implements UserService{

    String findUserNameById(Integer userId){

        //查数据或查缓存获取到用户名

        return "田哥"

    }

}

Copier après la connexion

Maintenant, un contrôleur souhaite appeler la méthode findUserNameById de UserServiceImpl pour obtenir le nom d'utilisateur.

1

2

3

4

5

6

7

8

9

10

@RestController

public class UserController{

    @Resource

    private UserService userService;

     

    @GetMapping("/test")

    public String test(){

        return userService.findUserNameById(1);

    }

}

Copier après la connexion

En supposant que les trois classes UserController, UserServiceImpl et UserService sont toutes dans le même projet, il est très simple pour le contrôleur d'appeler la méthode findUserNameById.

Cependant, si le contrôleur est un autre projet et veut être appelé comme ci-dessus (différence subtile, le ressenti est toujours le même), alors nous pouvons utiliser le framework RPC.

1. L'interface UserService doit être placée dans un projet distinct, que nous appelons généralement un projet API.

2. UserServiceImpl doit être placé dans un projet distinct, que nous appelons généralement le projet fournisseur.

3. Contrôleur, via le Web et d'autres projets (consommateurs)

4. Transformez l'API en package jar, puis référencez-la à la fois dans le projet consommateur et dans le projet fournisseur.

Les frameworks RPC sur le marché, tels que Dubbo (Alibaba), Thrift (FaceBook), gRpc (Google), brpc (Baidu), etc., se concentrent tous sur différents aspects pour résoudre l'objectif initial. Certains veulent l'être. extrêmement parfait, et certains veulent atteindre la perfection, certains recherchent la performance ultime, tandis que d'autres préfèrent l'extrême simplicité.

Principe RPC

Retour à ce que nous avons dit plus tôtAppelez un service à distance comme un appel local, quel support technique est nécessaire ?

  • Procuration dynamique, car notre projet consommateur n'a que des définitions d'interface UserService et aucune classe d'implémentation Vous souhaitez appeler une méthode d'interface ? Ensuite, vous pouvez uniquement créer un objet proxy.
  • Encodage, c'est-à-dire que le consommateur doit transmettre les paramètres de la demande au fournisseur. Le processus de transmission réseau encode d'abord nos paramètres, puis les transmet au fournisseur.
  • Communication réseau, les processus croisés impliqueront certainement une communication réseau.
  • Protocole de transmission réseau, consommateur et fournisseur. Il doit y avoir une norme pour les informations sur les paramètres qui vont et viennent, comment me les transmettre sinon, comment puis-je savoir ce que vous voulez exprimer ?
  • Sérialisation et désérialisation
  • Compression des données Lors de la transmission de données sur le réseau, si les données sont trop volumineuses, nous devons déterminer si les données peuvent être compressées.
  • Registration Center, si le fournisseur effectue un déploiement de cluster (le même service est déployé sur plusieurs machines), alors nous devons effectuer une maintenance manuelle sur le consommateur. Si le volume augmente, la charge de travail peut être imaginée.
  • Conscience dynamique du service en ligne et hors ligne Si le fournisseur est en panne ou qu'un nouveau nœud est déployé, le consommateur a besoin de savoir quels services sont hors ligne et quels services sont en ligne.
  • Routage dynamique, si le fournisseur est déployé dans un cluster (le même service est déployé sur plusieurs machines), on ne peut pas laisser tomber les consommateurs sur le même nœud, de sorte que les ressources ne peuvent pas être pleinement utilisées, et le la pluie et la rosée de l'ancien empereur seront partagées à parts égales . Le routage dynamique implique une variété d'algorithmes, tels que la randomisation, l'interrogation, la pondération, etc.

Pourquoi un centre d'enregistrement est-il nécessaire ? Je l'ai déjà partagé :

Interview Meituan : Comment concevoir un centre d'enregistrement ?

造轮子

根据上面的这些原理,田哥也搞了一个RPC框架,命名为mink(一个动物的名称)。

1

2

3

4

--mink

----mink-rpc rpc基本功能

----mink-registry 服务注册与发现

----mink-spring 集成SpringBoot

Copier après la connexion

然后,我们把mink-spring打成jar包,服务发布和服务引用都把这个jar给依赖进去。

Le framework RPC manuscrit n'est vraiment pas seulement destiné à faire semblant d'avoir 13 ans !

Le framework RPC manuscrit n'est vraiment pas seulement destiné à faire semblant d'avoir 13 ans !

Le framework RPC manuscrit n'est vraiment pas seulement destiné à faire semblant d'avoir 13 ans !


框架使用

上面,我们创造了轮子,下面,我们就来看如何使用。

Le framework RPC manuscrit n'est vraiment pas seulement destiné à faire semblant d'avoir 13 ans !

mink-demo就是一个Spring Boot项目,有三个module。

Le framework RPC manuscrit n'est vraiment pas seulement destiné à faire semblant d'avoir 13 ans !


我们把mink-api打成jar包,共consumer和provider使用。

也就是我们在consumer和provider都引入:

1

2

3

4

5

<dependency>

    <groupId>com.tian</groupId>

    <artifactId>mink-api</artifactId>

    <version>1.0-SNAPSHOT</version>

</dependency>

Copier après la connexion

下面,我们来看看provider端的代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<dependency>

   <groupId>com.tian</groupId>

   <artifactId>mink-spring</artifactId>

   <version>1.0-SNAPSHOT</version>

</dependency>

<dependency>

   <groupId>com.tian</groupId>

   <artifactId>mink-api</artifactId>

   <version>1.0-SNAPSHOT</version>

</dependency>

<dependency>

   <groupId>org.springframework.boot</groupId>

   <artifactId>spring-boot-starter</artifactId>

   <version>2.5.4</version>

</dependency>

Copier après la connexion

我们的mink框架,只需要引入mink-spring依赖即可。

接着就是properties的配置:

1

2

3

mink.rpc.servicePort=20880

mink.rpc.registryType=0

mink.rpc.registryAddress=127.0.0.1:2181

Copier après la connexion

再来看看具体服务实现类:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

package com.tian.service;

 

import com.tian.annotation.MinkService;

 

/**

 * @author tianwc  公众号:java后端技术全栈、面试专栏

 * @version 1.0.0

 * @description 用户服务

 * @createTime 2022年08月23日 18:16

 */

@MinkService

public class UserServiceImpl implements UserService {

    @Override

    public String findUserNameByiD(Integer id) {

        System.out.println("服务调用");

        return "tian";

    }

}

Copier après la connexion

这一步,我们只需要在实现类上加上注解@MinkService即可。

最后就是项目启动类:

1

2

3

4

5

6

7

@ComponentScan(basePackages = {"com.tian.service","com.tian"})

@SpringBootApplication

public class Application {

    public static void main(String[] args) {

        SpringApplication.run(Application.class, args);

    }

}

Copier après la connexion

我们启动项目(注册中心用的是zookeeper):

Le framework RPC manuscrit n'est vraiment pas seulement destiné à faire semblant d'avoir 13 ans !


从日志中可以看出,我们的服务已经成功注册到注册中心了。

下面,我们来看看consumer端代码。

首先来看看依赖:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<dependency>

   <groupId>com.tian</groupId>

   <artifactId>mink-spring</artifactId>

   <version>1.0-SNAPSHOT</version>

</dependency>

<dependency>

   <groupId>com.tian</groupId>

   <artifactId>mink-api</artifactId>

   <version>1.0-SNAPSHOT</version>

</dependency>

<dependency>

   <groupId>org.springframework.boot</groupId>

   <artifactId>spring-boot-starter</artifactId>

   <version>2.5.4</version>

</dependency>

<dependency>

   <groupid>org.springframework.boot</groupid>

   <artifactid>spring-boot-starter-web</artifactid>

   <version>2.5.4</version>

</dependency>

Copier après la connexion

这依赖也很简单,没什么好说的。

再来看看properties配置项:

1

2

3

4

mink.rpc.registryType=0

mink.rpc.registryAddress=127.0.0.1:2181

 

server.port=8090

Copier après la connexion

是不是也很简单?

再来看看我们的controller代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

package com.tian.controller;

 

import com.tian.annotation.MinkReference;

import com.tian.service.UserService;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

 

/**

 * @author tianwc  公众号:java后端技术全栈、面试专栏

 * @version 1.0.0

 * @description 消费端

 * @createTime 2022年08月23日 23:08

 */

@RestController

public class UserController {

 

    @MinkReference

    private UserService userService;

 

    @RequestMapping("/test")

    public String test() {

        return userService.findUserNameByiD(1);

    }

}

Copier après la connexion

需要用到对应服务,只需要添加注解@MinkReference即可。

最后就是项目启动类,简单的不行。

1

2

3

4

5

6

@SpringBootApplication

public class Application {

    public static void main(String[] args) {

        SpringApplication.run(Application.class, args);

    }

}

Copier après la connexion

启动日志:

Le framework RPC manuscrit n'est vraiment pas seulement destiné à faire semblant d'avoir 13 ans !

访问:http://localhost:8090/test

Le framework RPC manuscrit n'est vraiment pas seulement destiné à faire semblant d'avoir 13 ans !

成功!整个过程,非常轻松地集成mink框架并在业务代码中使用。

总结起来,其实就三步:

1、pom中添加依赖

2、properties文件中配置注册中心信息

3、使用的时候加上注解@MinkReference@MinkService即可

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Le framework RPC manuscrit n'est vraiment pas seulement destiné à faire semblant d'avoir 13 ans ! Le framework RPC manuscrit n'est vraiment pas seulement destiné à faire semblant d'avoir 13 ans ! Aug 16, 2023 pm 05:01 PM

Peut-être qu'on ne vous l'a pas demandé, peut-être avez-vous de la chance, ou peut-être n'êtes-vous pas encore à ce niveau. Habituellement, le salaire mensuel est supérieur à 20 000 et ils poseront essentiellement des questions de conception. Du point de vue de l'intervieweur : il est préférable de poser ce type de questions plutôt que de rédiger un essai en huit parties, qui implique de nombreux points techniques. Par exemple : connaissances sur les modèles de conception, les protocoles de communication, les agents dynamiques, la virtualisation, les pools de threads, etc.

Intervieweur d'Alibaba : Veuillez écrire à la main un framework RPC pour moi. Intervieweur d'Alibaba : Veuillez écrire à la main un framework RPC pour moi. Aug 17, 2023 pm 04:24 PM

RPC est un protocole de communication informatique. Ce protocole permet à un programme exécuté sur un ordinateur d'appeler un sous-programme sur un autre ordinateur sans que le développeur ait à programmer en plus cette interaction.

Principes et applications du framework RPC en langage Go Principes et applications du framework RPC en langage Go Jun 01, 2023 pm 03:01 PM

1. Le concept de framework RPC Dans les systèmes distribués, les données doivent souvent être transférées entre différents serveurs et clients. Le framework RPC (RemoteProcedureCall) est un moyen technique couramment utilisé. Le framework RPC permet aux applications d'appeler des fonctions ou des méthodes d'un autre environnement d'exécution via une messagerie à distance, permettant ainsi au programme de s'exécuter sur différents ordinateurs. Il existe actuellement de nombreux frameworks RPC sur le marché, tels que gRPC de Google, Thrift, Hessian, etc. Cet article présente principalement

Comment développer le framework RPC en PHP ? Comment développer le framework RPC en PHP ? May 13, 2023 pm 03:22 PM

RPC (RemoteProcedureCall) est un protocole de communication inter-processus qui permet à différents processus de communiquer et de collaborer sur le réseau sur différentes machines physiques. Le framework RPC attire de plus en plus l'attention car il peut aider les développeurs à mettre en œuvre facilement le développement de systèmes distribués. Dans cet article, nous présenterons étape par étape comment utiliser PHP pour développer le framework RPC. 1. Qu'est-ce que le cadre RPC ? Le framework RPC est un framework utilisé pour implémenter des appels de procédure distante. En mode RPC

Quels sont les frameworks RPC ? Quels sont les frameworks RPC ? Aug 03, 2023 am 10:17 AM

Les frameworks rpc incluent : 1. gRPC, un framework RPC open source hautes performances développé par Google ; 2. Apache Thrift, un framework RPC multilingue développé et open source par Facebook 3. Apache Dubbo, un framework RPC de haute qualité ; framework RPC performant et léger, adapté aux systèmes distribués à grande échelle ; 4. Apache Axis2, un framework RPC basé sur les normes de services Web ; 5. Spring Cloud, un framework open source pour la création de systèmes distribués.

Évaluation du framework RPC du langage Go : performances, facilité d'utilisation, comparaison du support communautaire Évaluation du framework RPC du langage Go : performances, facilité d'utilisation, comparaison du support communautaire Feb 27, 2024 pm 09:12 PM

En tant que langage de programmation moderne important, le langage Go est de plus en plus utilisé dans le développement de systèmes distribués. Lors de la construction d’un système distribué, le choix du framework RPC (appel de procédure à distance) est souvent crucial. Cet article procédera à une évaluation horizontale des frameworks RPC actuels du langage Go, comparera leurs avantages et leurs inconvénients en termes de performances, de facilité d'utilisation et de support communautaire, et joindra des exemples de code spécifiques. 1. Comparaison des performances Dans les systèmes distribués, les performances sont souvent l'un des principaux indicateurs auxquels les développeurs prêtent attention. Voici quelques principaux

Comment implémenter un framework RPC à haute concurrence en langage Go Comment implémenter un framework RPC à haute concurrence en langage Go Aug 05, 2023 pm 12:49 PM

Introduction à la façon de mettre en œuvre un framework RPC à haute concurrence dans le langage Go : Avec le développement rapide d'Internet, les applications à haute concurrence ont attiré de plus en plus d'attention. L'utilisation du framework RPC (RemoteProcedureCall) est une solution courante. Cet article présentera comment implémenter un framework RPC à haute concurrence dans le langage Go et sera accompagné d'exemples de code. Introduction au framework RPC : RPC est un protocole de communication qui permet à un programme informatique d'appeler un sous-programme dans un autre espace d'adressage (généralement situé sur l'ordinateur distant) sans

Quels sont les frameworks RPC dans PHP7.0 ? Quels sont les frameworks RPC dans PHP7.0 ? May 29, 2023 am 11:10 AM

Avec le développement continu de la technologie informatique, les systèmes distribués sont devenus courants et l'appel de procédure à distance (RPC) est un moyen important de mettre en œuvre des systèmes distribués. En tant que langage de programmation Web populaire, PHP possède également son propre framework RPC, parmi lequel de nouveaux frameworks RPC ont été introduits dans la version PHP7.0. Cet article présentera les frameworks RPC courants et leurs caractéristiques dans PHP7.0. PHPRemoteProcedureCall(phpRPC)phpRPC est un RP léger