Die Best Practice von Microservices, keine Transformation, um die Interoperabilität von Spring Cloud und Apache Dubbo zu erreichen

Autor: Sun Cairong

Leider ist dies kein Artikel über die Theorie oder das Prinzip der Middleware. Es gibt keine Analyse tiefgreifender und unklarer Arbeitsprinzipien und am Ende des Artikels gibt es keine erstaunlichen technischen Statistiken. In diesem Artikel werden tatsächliche Projekte und Codes als Beispiele verwendet, um Schritt für Schritt zu demonstrieren, wie Sie die Interkommunikation zwischen dem Apache Dubbo-System und dem Spring Cloud-System zu den niedrigsten Kosten realisieren und dann die gemischte Bereitstellung und Migration verschiedener Microservice-Systeme realisieren können, um Ihnen bei der Lösung zu helfen aktuelle Architektur- und Geschäftsprobleme.

Hintergrund und Ziele

Wenn Sie mit einigen der folgenden Geschäftsszenarien konfrontiert sind, die während der Entwicklung von Microservices gelöst werden müssen, kann Ihnen dieser Artikel helfen:

  • Sie verfügen bereits über eine Reihe von Microservice-Anwendungen, die auf Dubbo basieren. Zu diesem Zeitpunkt müssen Sie einige Dienste in Form von REST HTTP (Nicht-Schnittstelle, Methodenmodus) für einige Standard-HTTP-Aufrufe (z. B. Spring Cloud-Client) veröffentlichen vollständig Es ist am besten, einige Konfigurationen und Anmerkungen direkt zum geschriebenen Dubbo-Dienst hinzuzufügen, ohne den Code zu ändern.
  • Sie verfügen bereits über ein auf Spring Cloud basierendes Microservice-System und erstellen dann ein auf Dubbo basierendes Microservice-System. Sie möchten, dass die beiden Systeme koexistieren, sodass nun beide Seiten die von der anderen Seite veröffentlichten Dienste aufrufen müssen. Das heißt, die Dubbo-Anwendung als Verbraucher muss die von Spring Cloud veröffentlichte HTTP-Schnittstelle aufrufen, und die Dubbo-Anwendung als Anbieter kann auch eine HTTP-Schnittstelle veröffentlichen, die Spring Cloud aufrufen kann.
  • Aus bestimmten historischen Gründen planen Sie die Migration von einem Microservice-System auf ein anderes. Voraussetzung ist die Gewährleistung einer reibungslosen Migration des Zwischenprozesses.

Fügen Sie hier eine Bildbeschreibung ein

Für die oben genannten Szenarien können wir die integrierte REST-Programmierparadigmenunterstützung von Dubbo3 verwenden, die es Dubbo ermöglicht, als Verbraucher zum Aufrufen des HTTP-Schnittstellendienstes und als Anbieter für die Freigabe von HTTP-Diensten im REST-Stil für die Außenwelt zu fungieren Gleichzeitig unterstützt der gesamte Codierungsprozess das in der Branche häufig verwendete REST-Programmierparadigma (wie JAX-RS, Spring MVC usw.), sodass der gegenseitige Aufruf zwischen Dubbo und Spring Cloud realisiert werden kann, ohne dass Code geändert werden muss.

  • Weitere Informationen zum Design und zur theoretischen Ausarbeitung dieses Teils finden Sie im Blogbeitrag hier [ 1]
  • Weitere Konfigurationsmethoden von Dubbo REST finden Sie im Rest-Referenzhandbuch [ 2]

Beispiel 1: Dubbo ruft Spring Cloud auf

Falls bereits ein Spring Cloud-Mikroservicesystem vorhanden ist, demonstrieren Sie, wie Sie mit Dubbo Spring Cloud-Dienste aufrufen (einschließlich automatischer Adresserkennung und Protokollübertragung). In Bezug auf Registrierungszentren wird in diesem Beispiel Nacos als Registrierungszentrum verwendet. Dies gilt auch für Registrierungszentren, die von beiden Systemen wie Zookeeper und Consul unterstützt werden.

Fügen Sie hier eine Bildbeschreibung ein

Stellen Sie sich vor, Sie verfügen bereits über ein Spring Cloud-Mikroservicesystem. Jetzt stellen wir das Dubbo-Framework vor, damit die Dubbo-Anwendung die von Spring Cloud veröffentlichten Dienste normal aufrufen kann. Den vollständigen Quellcode dieses Beispiels finden Sie unter Samples/dubbo-call-sc [ 3 ] .

Starten Sie Spring Cloud Server

Die Struktur der Spring Cloud-Anwendung im Beispiel ist wie folgt:

Fügen Sie hier eine Bildbeschreibung ein

Die Anwendungskonfigurationsdatei lautet wie folgt:

server:
  port: 8099
spring:
  application:
    name: spring-cloud-provider-for-dubbo
  cloud:
    nacos:
      serverAddr: 127.0.0.1:8848 #注册中心

Nachfolgend finden Sie eine sehr einfache Controller-Definition, die einen http-Endpunkt in /users/list/ veröffentlicht.

@RestController
@RequestMapping("/users")
public class UserController {
    @GetMapping("/list")
    public List<User> getUser() {
        return Collections.singletonList(new User(1L, "spring cloud server"));
    }
}

Starten Sie SpringCloudApplication und besuchen Sie http://localhost:8099/users/list über cURL oder einen Browser, um zu testen, ob die Anwendung erfolgreich gestartet wird.

Verwenden Sie den Dubbo-Client, um den Dienst aufzurufen

Der Dubbo-Client ist ebenfalls eine Standard-Dubbo-Anwendung. Die Grundstruktur des Projekts ist wie folgt:

Fügen Sie hier eine Bildbeschreibung ein

Eine der kritischsten davon ist die folgende Schnittstellendefinition (unter normalen Umständen können die folgenden Schnittstellen ohne Änderungen direkt aus der ursprünglichen Spring Cloud-Clientanwendung kopiert werden).

Wenn es noch keine auf OpenFeign basierende Spring Cloud-Verbraucheranwendung gibt, müssen Sie selbst eine Schnittstelle definieren. Zu diesem Zeitpunkt müssen Sie keine OpenFeign-Annotationen verwenden, sondern nur Spring MVC-Standardanmerkungen.

Registrieren Sie die UserServiceFeign-Schnittstelle über die Annotation DubboReference als Dubbo-Dienst.

@DubboReference
private UserServiceFeign userService;

Als Nächstes können wir auf die Dubbo-Standardmethode einen Anruf beim Dienst einleiten.

List<User> users = userService.users();

Starten Sie die Dubbo-Anwendung über DubboConsumerApplication und überprüfen Sie, ob der Spring Cloud-Dienst erfolgreich aufgerufen werden kann.

Beispiel 2: Spring Cloud ruft Dubbo an

Im nächsten Beispiel zeigen wir, wie man die vom Dubbo-Server veröffentlichten Dienste für Spring Cloud-Clientaufrufe öffnet.

Fügen Sie hier eine Bildbeschreibung ein

Der relevante Quellcode des Beispiels befindet sich in Samples/sc-call-dubbo [ 4]

Starten Sie Dubbo Server

Die Codestruktur der Dubbo-Serveranwendung ist sehr einfach und es handelt sich um eine typische Dubbo-Anwendung.

Fügen Sie hier eine Bildbeschreibung ein

Im Vergleich zu gewöhnlichen Dubbo-Dienstdefinitionen müssen wir der Schnittstelle die folgenden Standard-Spring-MVC-Anmerkungen hinzufügen:

@RestController
@RequestMapping("/users")
public interface UserService {
    @GetMapping(value = "/list")
    List<User> getUsers();
}

Zusätzlich zu den oben genannten Anmerkungen sind auch andere Diensteveröffentlichungen und andere Prozesse gleich. Verwenden Sie einfach die DubboService-Annotation, um den Dienst zu veröffentlichen:

@DubboService
public class UserServiceImpl implements UserService {
    @Override
    public List<User> getUsers() {
        return Collections.singletonList(new User(1L, "Dubbo provider!"));
    }
}

Achten Sie bei der Dienstkonfiguration besonders auf die Notwendigkeit, das Dienstprotokoll als Rest Protocol: Rest zu konfigurieren und Register-Mode: Instanz für den Adresserkennungsmodus zu verwenden:

dubbo:
  registry:
    address: nacos://127.0.0.1:8848
    register-mode: instance
  protocol:
    name: rest
    port: 8090

Starten Sie die Dubbo-Anwendung und besuchen Sie dann die folgende Adresse, um zu überprüfen, ob der Dienst normal ausgeführt wird: http://localhost:8090/users/list

Verwenden Sie Spring Cloud, um Dubbo anzurufen

Wenn Sie OpenFeign zum Entwickeln einer Standard-Spring Cloud-Anwendung verwenden, können Sie den oben veröffentlichten Dubbo-Dienst aufrufen. Die Projektcodestruktur ist wie folgt:

Fügen Sie hier eine Bildbeschreibung ein

Darunter definieren wir eine OpenFeign-Schnittstelle zum Aufrufen des oben veröffentlichten Dubbo-Rest-Dienstes.

@FeignClient(name = "dubbo-provider-for-spring-cloud")
public interface UserServiceFeign {
    @RequestMapping(value = "/users/list", method = RequestMethod.GET)
    List<User> getUsers();
}

Definieren Sie den folgenden Controller als Testeintrag für OpenFeign und RestTemplate:

public class UserController {

    private final RestTemplate restTemplate;
    private final UserServiceFeign userServiceFeign;

    public UserController(RestTemplate restTemplate,
                          UserServiceFeign userServiceFeign) {
        this.restTemplate = restTemplate;
        this.userServiceFeign = userServiceFeign;
    }

    @RequestMapping("/rest/test1")
    public String doRestAliveUsingEurekaAndRibbon() {
        String url = "http://dubbo-provider-for-spring-cloud/users/list";
        System.out.println("url: " + url);
        return restTemplate.getForObject(url, String.class);
    }

    @RequestMapping("/rest/test2")
    public List<User> doRestAliveUsingFeign() {
        return userServiceFeign.getUsers();
    }
}

Gemäß der oben genannten Definition des Verantwortlichen können wir jeweils die folgenden Adressen zur Überprüfung aufsuchen:

  • OpenFeign-Methode: http://localhost:8099/dubbo/rest/test1
  • RestTemplage-Methode: http://localhost:8099/dubbo/rest/test2

Veröffentlichen Sie weitere Dienste für Dubbo Server

Wir können den Multiprotokoll-Veröffentlichungsmechanismus von Dubbo verwenden, um die Multiprotokoll-Veröffentlichung für einige Dienste zu konfigurieren. Als Nächstes fügen wir dem oben genannten Dubbo-Serverdienst die Veröffentlichung des Dubbo-TCP-Protokolls hinzu, um den folgenden Bereitstellungseffekt zu erzielen, sodass diese Dubbo-Anwendung sowohl das Dubbo-Microservice-System als auch das Spring Cloud-Microservice-System bedienen kann.

Fügen Sie hier eine Bildbeschreibung ein

Um diesen Effekt zu erzielen, müssen wir der Konfiguration lediglich eine Multiprotokollkonfiguration hinzufügen:

dubbo:
  protocols:
    - id: rest
      name: rest
      port: 8090
    - id: dubbo
      name: dubbo
      port: 20880

Gleichzeitig wird auch die Veröffentlichung mehrerer Protokolle in der Dienstanmerkung konfiguriert:

@DubboService(protocol="rest,dubbo")
public class UserServiceImpl implements UserService {}

Auf diese Weise haben wir den UserService-Dienst erfolgreich mit Dubbo- und Rest-Protokollen (Multi-Port- und Multi-Protokoll-Methode) veröffentlicht. Das Dubbo-Protokoll bedient das Dubbo-System und das Rest-Protokoll bedient das Spring Cloud-System.

Hinweis: Dubbo bietet zwei Modi: Single-Port und Multi-Port für die Veröffentlichung mehrerer Protokolle. Diese Flexibilität wird für Dienste in verschiedenen Bereitstellungsumgebungen von großer Hilfe sein. Bevor Sie die von Ihnen benötigte Multiprotokoll-Veröffentlichungsmethode bestimmen, lesen Sie bitte das folgende Dokument zur Multiprotokoll-Konfiguration [ 5] sorgfältig durch.

Zusammenfassen

Basierend auf dem Restprogrammierungsparadigma von Dubbo, der Veröffentlichung mehrerer Protokolle und anderen Funktionen kann es Ihnen dabei helfen, die Veröffentlichung des HTTP-Protokolls von Dubbo-Diensten einfach zu implementieren, sodass Back-End-Dienste effizient auf RPC-Basis kommunizieren können und gleichzeitig dies können Es ist einfacher, mit dem http-Dienstsystem durchzukommen. Dieses Beispiel besteht Die Koexistenz- und Interkommunikationsbeispiele der beiden Systeme Dubbo und Spring Cloud veranschaulichen den Codierungsprozess deutlich.

Die offizielle Version dieses Teils wird offiziell in der Dubbo-Version 3.3.0 veröffentlicht, die auch ein großes Upgrade des Triple-Protokolls enthält, also bleiben Sie dran!

Verwandte Links:

[1] Blogbeitrag

https://cn.dubbo.apache.org/zh-cn/blog/2023/01/05/dubbo-%e8%bf%9e%e6%8e%a5%e5%bc%82%e6%9e%84 %e5%be%ae%e6%9c%8d%e5%8a%a1%e4%bd%93%e7%b3%bb-%e5%a4%9a%e5%8d%8f%e8%ae%ae% e5%a4%9a%e6%b3%a8%e5%86%8c%e4%b8%ad%e5%bf%83/

[2] Restgebrauchsreferenzhandbuch

https://cn.dubbo.apache.org/zh-cn/overview/reference/proposals/protocol-http/

[3] Proben/Dubbo-Call-sc

https://github.com/apache/dubbo-samples/tree/master/2-advanced/dubbo-samples-springcloud/dubbo-call-sc

[4] Samples/sc-call-dubbo

https://github.com/apache/dubbo-samples/tree/master/2-advanced/dubbo-samples-springcloud/sc-call-dubbo

[5] Multiprotokollkonfiguration

https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/service/multi-protocols/

Guess you like

Origin blog.csdn.net/alisystemsoftware/article/details/132346856