Günlük blog | Dubbo'nun entegrasyonunu ve kullanımını anlamak için bir makale

Açık kaynak Çin OSC başlık numarasını takip edin ve en son teknik bilgileri alın

Önsöz

Bu yılın başında, Alibaba'nın açık kaynaklı yüksek performanslı hizmet çerçevesi dubbo yeni bir güncelleme turu başlattı ve Apache kuluçka makinesine katıldı. Orijinal projede bahar bulutu kullanıldıktan sonra dubbo daha az kullanıldı. Şu anda, orijinal endüstri uygulama departmanına geri aktarılmıştır ve ayrıca servis çağrıları için dubbo kullanabilir. Öğrenmek için ders kitabı yazma fırsatından yararlanın. Ve şimdi Dubbo ayrıca bir springboot başlangıç projesi başlattı SpringBoot'un yardımıyla entegrasyon çok rahat, temelde bağımlı paketlerin giriş problemi. Saçma sapan konuşmayı bırak, başlayalım ~

Biraz bilgi

Dubbo ile iletişim halinde olmayan öğrenciler için öncelikle ilgili bilgileri anlayabilirsiniz.

Dubbo'ya Giriş

Dubbo, Alibaba'nın açık kaynaklı, yüksek performanslı bir hizmet çerçevesidir.Yüksek performanslı ve şeffaf RPC uzaktan servis çağırma çözümleri ve SOA servis yönetişimi çözümleri sunmayı taahhüt eder, böylece uygulamaların hizmet çıktı ve giriş işlevlerini ve Spring'i yüksek performanslı RPC aracılığıyla gerçekleştirebilir. Çerçeve sorunsuz bir şekilde bütünleşir. Dubbo üç temel bölümden oluşur: uzaktan iletişim, küme hatası toleransı ve otomatik keşif.

Yerel yöntemler gibi uzak yöntemlerin çağrılmasını gerçekleştiren şeffaf uzaktan yöntem çağrısı sağlar ve herhangi bir API saldırısı olmadan yalnızca basit yapılandırmaya ihtiyaç duyar. Aynı zamanda intranette F5 gibi donanım yük dengeleyicilerin yerini alabilen, maliyetleri düşüren ve tek noktaları azaltan soft bir yük dengeleme ve hata tolerans mekanizmasına sahiptir. Otomatik servis kaydı ve keşfi gerçekleştirebilir, servis sağlayıcının adresini yazmaya gerek yoktur, kayıt merkezi, arayüz adına göre servis sağlayıcının IP adresini sorgular ve servis sağlayıcıları sorunsuz bir şekilde ekleyebilir veya silebilir.

2011 yılının sonunda Alibaba, GitHub'da Java tabanlı dağıtılmış hizmet yönetişim çerçevesi Dubbo'yu açtı ve daha sonra Çin'de bu tür bir açık kaynak projesinin lideri oldu ve birçok geliştirici kendi iyiliklerini dile getirdi. Aynı zamanda pek çok firma uygulamada Dubbo'ya dayalı dağıtık sistem mimarisi uygulamıştır. Şu anda GitHub'da çatal ve yıldız sayısı 10.000'i aştı.

Dubbo temel işlevleri :

  • Uzaktan iletişim, "istek-yanıt" modunda çoklu iş parçacığı modelleri, serileştirme ve bilgi alışverişi yöntemleri dahil olmak üzere kalıcı bağlantılara dayalı çeşitli NIO çerçevelerinin soyut kapsüllenmesini sağlar.
  • Küme hata toleransı, çoklu protokol desteği ve yumuşak yük dengeleme, hata toleransı, adres yönlendirme ve dinamik yapılandırma gibi küme desteği dahil olmak üzere arabirim yöntemlerine dayalı şeffaf uzaktan yordam çağrıları sağlar.
  • Kayıt merkezi rehber hizmetine dayalı otomatik keşif, hizmet tüketicilerinin dinamik olarak hizmet sağlayıcıları bulmasını sağlar, adresleri şeffaf hale getirir ve hizmet sağlayıcıların makineleri sorunsuz bir şekilde eklemesini veya azaltmasını sağlar.

Dubbo mimarisi

  • Servis Sağlayıcı - Başlangıçta belirtilen bağlantı noktasındaki hizmeti açığa çıkarın ve hizmet adresini ve bağlantı noktasını kayıt defterine kaydedin
  • Hizmet tüketicisi - hizmet sağlayıcının adres listesini almak için başlangıçta kayıt defterinin ilgilendiği hizmete abone olun
  • Kayıt Merkezi - hizmet kaydı ve keşfinden sorumlu, hizmet sağlayıcı tarafından bildirilen adres bilgilerini kaydetmek ve hizmet tüketicisine göndermekle sorumludur.
  • İzleme Merkezi - Hizmet sağlayıcıların ve tüketicilerin, hizmet çağrılarının sayısı, gecikmeler, vb. Çalışma durumlarının izlenmek üzere toplanmasından sorumludur.
  • Servis sağlayıcının başlatma, yükleme ve yaşam döngüsü yönetiminden sorumlu konteyneri çalıştırın
  • Dağıtım aşaması

    • Hizmet sağlayıcı, hizmeti belirlenen bağlantı noktasında gösterir ve hizmet bilgilerini kayıt defterine kaydeder.
    • Hizmet tüketicisi, kayıt defterine hizmet adresi listesine bir abonelik başlatır.

    İşletme aşaması

    • Kayıt merkezi, adres listesi bilgilerini hizmet tüketicilerine iter.
    • Adres listesini aldıktan sonra, hizmet tüketicisi hedef hizmete bir arama başlatmak için bunlardan birini seçer.
    • Arayan işlemin hizmet tüketicilerinin ve hizmet sağlayıcılarının çalışma durumu izleme merkezine bildirilir.

    Çağrı ilişkisi açıklaması

  • Servis kabı, servis sağlayıcının başlatılması, yüklenmesi ve çalıştırılmasından sorumludur.
  • Servis sağlayıcı başladığında, sağladığı hizmeti kayıt merkezine kaydeder.
  • Hizmet tüketicisi başladığında ihtiyaç duyduğu hizmet için kayıt merkezine abone olur.
  • Kayıt defteri, tüketicilere servis sağlayıcı adreslerinin bir listesini döndürür. Değişiklikler varsa, kayıt defteri değiştirilen verileri uzun bağlantıya göre tüketicilere gönderir.
  • Hizmet tüketicileri, yumuşak yük dengeleme algoritmasına dayalı olarak, sağlayıcı adres listesinden, aramak için bir sağlayıcı seçin ve arama başarısız olursa başka bir arama seçin.
  • Hizmet tüketicileri ve sağlayıcılar, çağrı sayısını ve çağrı süresini hafızada biriktirir ve her dakika izleme merkezine istatistiksel verileri gönderir.
  • Dubbo özellikleri

    Dubbo mimarisi, gelecekteki mimariye bağlanabilirlik, sağlamlık, ölçeklenebilirlik ve yükseltilebilirlik gibi aşağıdaki özelliklere sahiptir.

    Bağlantı

    • Kayıt merkezi, bir rehber hizmetine eşdeğer olan hizmet adresinin kaydedilmesi ve araştırılmasından sorumludur.Servis sağlayıcılar ve tüketiciler, başlangıçta yalnızca kayıt merkezi ile etkileşime girer. Kayıt merkezi talepleri iletmez, bu nedenle baskı daha azdır
    • İzleme merkezi, her hizmetin kaç kez arandığını, arama süresini vb. Saymaktan sorumludur. İstatistikler ilk olarak bellekte toplanır ve her dakika izleme merkezi sunucusuna gönderilir ve raporlarda görüntülenir.
    • Servis sağlayıcı sağladığı hizmetleri kayıt merkezine kaydeder ve arama süresini izleme merkezine bildirir.Bu süre ağ ek yükünü içermez.
    • Hizmet tüketicisi, servis sağlayıcı adres listesini kayıt merkezinden alır ve sağlayıcıyı doğrudan yük algoritmasına göre arar ve aynı zamanda arama süresini izleme merkezine bildirir Bu süre, ağ ek yükünü içerir.
    • Kayıt merkezi, hizmet sağlayıcı ve hizmet tüketicisi, izleme merkezi dışında tüm kalıcı bağlantılardır
    • Sicil, servis sağlayıcının varlığını uzun bağlantı yoluyla algılar ve servis sağlayıcı çalışmaz, kayıt defteri derhal olayı tüketicileri bilgilendirmek için zorlayacaktır.
    • Kayıt merkezi ve izleme merkezi, halihazırda çalışan sağlayıcıları ve tüketicileri etkilemeyecek şekilde kapalı durumda. Tüketiciler, sağlayıcı listesini yerel olarak önbelleğe alıyor
    • Hem kayıt merkezi hem de izleme merkezi isteğe bağlıdır ve hizmet tüketicileri doğrudan hizmet sağlayıcıya bağlanabilir

    Sağlamlık

    • İzleme merkezinin kapalı kalma süresi kullanımı etkilemez, ancak bazı örnekleme verileri kaybolur
    • Veritabanı çöktükten sonra, kayıt defteri önbellek aracılığıyla hizmet listesi sorguları sağlamaya devam edebilir, ancak yeni hizmetleri kaydedemez
    • Kayıt merkezi eş küme, herhangi biri düştükten sonra otomatik olarak diğerine geçecektir.
    • Kayıt defteri tamamen kapandıktan sonra, hizmet sağlayıcılar ve hizmet tüketicileri yerel önbellek aracılığıyla iletişim kurmaya devam edebilir
    • Servis sağlayıcı vatansızdır, bunlardan herhangi biri arızalandığında, kullanımı etkilemeyecektir.
    • Servis sağlayıcıların tümü çalışmaz hale geldikten sonra, servis tüketici uygulamaları kullanılamayacak ve servis sağlayıcının kurtarması için süresiz olarak yeniden bağlanacaktır.

    Ölçeklenebilirlik

    • Kayıt defteri, makine dağıtım örneklerini dinamik olarak ekleyebilen eşler arası bir kümedir ve tüm istemciler yeni kayıt defterini otomatik olarak keşfedecektir.
    • Hizmet sağlayıcı durum bilgisizdir ve dinamik olarak makine dağıtım örneklerini ekleyebilir ve kayıt defteri, yeni hizmet sağlayıcı bilgilerini tüketicilere aktarır

    Yükseltilebilirlik

    Hizmet kümelerinin ölçeği daha da genişletildiğinde ve BT yönetişim yapısı daha da yükseltildiğinde, dinamik dağıtım ve mobil bilgi işlem gerekir Mevcut dağıtılmış hizmet mimarisi direnç getirmeyecektir. Aşağıdaki şekil, gelecekte olası bir mimaridir:

    Düğüm rolü açıklaması

    Düğüm rolü açıklaması Dağıtıcının yerel aracı Depo deposu, hizmeti otomatik olarak dağıtır, hizmet uygulaması sürüm paketini depolamak için kullanılır. Zamanlayıcı dağıtım merkezi, hizmet sağlayıcısını otomatik olarak artırır veya azaltır Yönetici birleşik yönetim konsolu Kayıt hizmeti kaydı ve erişim basıncına dayalı keşif. Ve çağrı süresi izleme merkezi

    Resmi web sitesi belgesini ziyaret edebilirsiniz: burada ayrıntılı talimatlar ve kullanım talimatları bulunmaktadır. Burada ayrıntıya girmeyeceğim.

    Dubbo entegrasyonu ve kullanımı

    Resmi kuluçka makinesi-dubbo-yay-önyükleme projesi projesine dayanarak, SpringBoot'a entegrasyon çok basittir.

    Not: Bu seri açıklama için hala 1.5.x sürümünü kullandığından, kullanılan sürüm 0.1.x'tir. SpringBoot 2.x kullanıyorsanız, 0.2.x sürümünü kullanabilirsiniz.

    Kolaylık sağlamak için, yaylı önyükleme-dubbo-api adlı bir arayüz projesi doğrudan burada oluşturulur.

    IHelloService.java

    / ** * Bir arayüz tanımlayın * @author oKong * * / genel arayüz IHelloService { Dize merhaba (Dize adı); }

    Servis sağlayıcıları

    Spring-boot-dubbo-provider projesi oluşturun. 0. Pom bağımlılığını tanıtın.

    < ! - API'yi tanıtın - > < bağımlılık > < Grup kimliği > cn.lqdev.learning < /Grup kimliği > < artifactId > Spring-boot-dubbo-api < / artifactId > < versiyon > 0.0.1-SNAPSHOT < / version > < /bağımlılık > < ! - Dubbo bağımlılığını tanıtın - > < bağımlılık > < Grup kimliği > com.alibaba.boot < /Grup kimliği > < artifactId > dubbo-yaylı-başlatıcı < / artifactId > < versiyon > 0.1.1 < / version > < /bağımlılık > < ! - Redis'i kayıt merkezi olarak tanıtın - > < bağımlılık > < Grup kimliği > org.springframework.boot < /Grup kimliği > < artifactId > Spring-boot-starter-data-redis < / artifactId > < /bağımlılık >

    Not: Redis, doğrudan kayıt merkezi olarak kullanılır. Varsayılan zookeeper'dır.

    1. Arayüz uygulama sınıfını yazın. HelloServiceImpl.java

    / ** * Bir hizmet uygulama sınıfı tanımlayın * @author oKong * * / // Burada böyle bir @ hizmetin dubbo olduğunu unutmayın @Hizmet( version = "$ {demo.service.version}", // Sürüm application = "$ {dubbo.application.id}", // uygulama kimliği protokol = "$ {dubbo.protocol.id}", // protokol kimliği kayıt = "$ {dubbo.registry.id}") // Kayıt merkezi kimliği @Filmdenkare public class HelloServiceImpl, IHelloService { @Override public String hello (Dize adı) { log.info ("dubbo sağlayıcı, parametre adı: {}", ad); return "merhaba" + isim + ", bu bir dubbo sağlayıcısıdır!"; } }

    Açıklama: @Service, arabirim sürümü, protokol kimliği ve kayıt kimliği gibi temel bilgileri belirten com.alibaba.dubbo.config.annotation.Service paket yolu altındaki ek açıklama sınıfıdır. Burada sürüm numarasının hala yararlı olduğuna dikkat edin, çünkü bir arabirimin birden çok sürümünün bir arada bulunması sorunu olacaktır, bu nedenle sürüm bilgisi genellikle ayarlanır. 2. Yapılandırma dosyası bilgilerini ayarlayın, kayıt türü, adres vb. Gibi dubbo ile ilgili bilgileri ekleyin.

    # Kolay tanımlama için uygulama adı dubbo.application.id = spring-boot-dubbo-provider dubbo.application.name = spring-boot-dubbo-provider server.port = 8686 # Sürümü ayarla demo.service.version = 1.0.0 #Protocol isteğe bağlı dubbo redis, http, tasarruf vb. dubbo.protocol.id = dubbo dubbo.protocol.name = dubbo dubbo.protocol.port = 20880 #Servis ve @Reference vb. Açıklamalı tarama yolunu ayarlayın. dubbo.scan.basePackages = cn.lqdev.learning.springboot.dubbo.provider.service # Kayıt merkezi yapılandırması dubbo.registry.id = okong-kayıt defteri #REGISTRATION CENTER TYPE Burada kayıt defteri olarak redis kullanın # zookeeper: //127.0.0.1: 2181 dubbo.registry.address = redis: //127.0.0.1: 6379 # Varsa kullanıcı adı ve şifreyi ayarlayın # dubbo.registry.username = oKong # dubbo.registry.password = oKong # Redis parametrelerini ayarlayın # Bağlantı havuzundaki en büyük ücretsiz bağlantı dubbo.registry.parameters.max.idle = 8 # Bağlantı havuzundaki maksimum bağlantı sayısı (sınır olmadığını belirtmek için negatif bir değer kullanın) dubbo.registry.parameters.max-active = 8 # Bağlantı havuzunun maksimum engelleme bekleme süresi (sınır olmadığını belirtmek için negatif bir değer kullanın) dubbo.registry.parameters.max-wait = -1 # Bağlantı havuzundaki en büyük ücretsiz bağlantı dubbo.registry.parameters.max-boşta = 8 # Bağlantı havuzundaki en küçük boşta bağlantı dubbo.registry.parameters.min-boşta = 0

    Not: Kolaylık sağlamak için Redis, doğrudan kayıt defteri olarak kullanılır. Redis bağlantısıyla ilgili yapılandırma parametreleri için, bunları dubbo.registry.parameters.xxx biçiminde ayarlayabilirsiniz Parametreler bir Map nesnesi olduğundan, eklenen anahtar büyük / küçük harfe dönüştürülmez. Belirli kayıt defteri yapılandırma nesneleri için com.alibaba.dubbo.config.RegistryConfig sınıfını görüntüleyebilirsiniz. Redis ile ilgili parametre yapılandırması için com.alibaba.dubbo.registry.redis.RedisRegistry sınıfını kontrol edebilirsiniz.

    Diğer kayıt merkezleri benzerdir.Gerekli kayıt merkezi konfigürasyon sınıflarını com.alibaba.dubbo.registry paketinde bulabilirsiniz.

    3. Sınıfta yazmaya başlayın.

    DubboProviderApplication.java

    / ** * dubbo sağlayıcı * @author oKong * * / @SpringBootApplication @Filmdenkare public class DubboProviderApplication { public static void main (String argümanları) Exception {atar // Dubbo sağlayıcısı yalnızca hizmet sağladığından, web dışı bir ortam olabilir yeni SpringApplicationBuilder (DubboProviderApplication.class) .web (false) .run (değiştirgeler); log.info ("ilkbahar-önyükleme-dubbo-sağlayıcı başlat!"); } }

    4. Uygulamayı başlatın, redis servisine erişebilir ve servis listesi bilgilerini görebilirsiniz.

    Hizmet tüketicisi

    Spring-boot-dubbo-tüketici projesini oluşturun. 0. Pom bağımlılığını tanıtın

    < ! - API'yi tanıtın - > < bağımlılık > < Grup kimliği > cn.lqdev.learning < /Grup kimliği > < artifactId > Spring-boot-dubbo-api < / artifactId > < versiyon > 0.0.1-SNAPSHOT < / version > < /bağımlılık > < ! - Dubbo bağımlılığını tanıtın - > < bağımlılık > < Grup kimliği > com.alibaba.boot < /Grup kimliği > < artifactId > dubbo-yaylı-başlatıcı < / artifactId > < versiyon > 0.1.1 < / version > < /bağımlılık > < ! - Redis'i kayıt merkezi olarak tanıtın - > < bağımlılık > < Grup kimliği > org.springframework.boot < /Grup kimliği > < artifactId > Spring-boot-starter-data-redis < / artifactId > < /bağımlılık > < bağımlılık > < Grup kimliği > org.springframework.boot < /Grup kimliği > < artifactId > Spring-boot-starter-web < / artifactId > < /bağımlılık >

    1. Kayıt merkezi ve hizmet sürümüyle ilgili bilgileri yapılandırma dosyasına ekleyin

    # Kolay tanımlama için uygulama adı dubbo.application.id = ilkbahar-önyükleme-dubbo-tüketici dubbo.application.name = ilkbahar-önyükleme-dubbo-tüketici server.port = 9696 #Servis ve @Reference vb. Açıklamalı tarama yolunu ayarlayın. dubbo.scan.basePackages = cn.lqdev.learning.springboot.dubbo.consumer # Kayıt merkezi yapılandırması dubbo.registry.id = okong-kayıt defteri #REGISTRATION CENTER TYPE Burada kayıt defteri olarak redis kullanın # zookeeper: //127.0.0.1: 2181 dubbo.registry.address = redis: //127.0.0.1: 6379 # Varsa kullanıcı adı ve şifreyi ayarlayın # dubbo.registry.username = oKong # dubbo.registry.password = oKong # Redis parametrelerini ayarlayın # Bağlantı havuzundaki en büyük ücretsiz bağlantı dubbo.registry.parameters.max.idle = 8 # Bağlantı havuzundaki maksimum bağlantı sayısı (sınır olmadığını belirtmek için negatif bir değer kullanın) dubbo.registry.parameters.max-active = 8 # Bağlantı havuzunun maksimum engelleme bekleme süresi (sınır olmadığını belirtmek için negatif bir değer kullanın) dubbo.registry.parameters.max-wait = -1 # Bağlantı havuzundaki en büyük ücretsiz bağlantı dubbo.registry.parameters.max-boşta = 8 # Bağlantı havuzundaki en küçük boşta bağlantı dubbo.registry.parameters.min-boşta = 0

    2. Sınıf yazmaya başlayın

    DubboConsumerApplication.java

    / ** * dubbo-tüketici örneği * @author oKong * * / @SpringBootApplication @Filmdenkare public class DubboConsumerApplication { public static void main (String argümanları) Exception {atar SpringApplication.run (DubboConsumerApplication.class, args); log.info ("ilkbahar-önyükleme-dubbo-tüketici başlangıcı!"); } }

    3. Servis çağrıları yapmak için bir restapi arayüz servisi yazın.

    / ** * Çağrı örneği * @author oKong * * / @Fotomac @Filmdenkare public class DemoController { / ** * Referans olarak beyan etmek aslında bir fasulye sınıfı belirlemektir, * Orijinal xml yapılandırmasını yorumlarla değiştirin * < dubbo: reference id = "xxxService" interface = "com.xxx.XxxService" / > * / @Reference (version = "1.0.0") IHelloService merhabaService; @GetMapping ("/ merhaba") public String hello (Dize adı) { log.info ("Çağrı sağlayıcı hizmeti, parametre adı: {}", ad); helloService.hello (ad) döndür; } }

    4. Uygulamayı başlatın ve şu adresi ziyaret edin: servis çağrısının başarılı olduğunu görebilirsiniz.

    Arka planı izleme

    Resmi izleme, varsayılan olarak zookeeper'ı destekler. Resmi belge ayrıca, redis köprü uygulamasının yalnızca açık kaynak sürümü için sağlandığını ve güvenilirliğinin Redis'in kendisinin güvenilirliğine bağlı olduğunu söyledi. Zookeeper kullanmanızı öneririm ve redis önbellek olarak kullanılmalıdır.

    İstasyon adresini izleme: https://github.com/apache/incubator-dubbo-ops Derlemek ve çalıştırmak için talimatları kendiniz kurabilirsiniz.

    Yeni izleme arayüzü:

    Apache kuluçka makinesine katıldıktan sonra arayüz İngilizcedir. . . Orijinalinde hala rahat görünüyor!

    Referans

  • sonuç olarak

    Bu bölüm esas olarak dubbo'nun entegrasyonunu ve basit kullanımını tanıtmaktadır. Spesifik ve diğer kullanımlar aslında öncekiyle aynıdır ve hiçbir fark yoktur. Yine de resmi belgeleri kontrol etmenizi öneririm revizyondan sonra içerik çok daha zengin ve çok fazla kuru mal var, kontrol etmeniz önerilir. Bu nihayet Çince versiyonu. Okumaktan zarar gelmez,

    Blog Yazarı: oKong

    Günlük blog sütunu, her gün sizin için mükemmel blog yazarlarından yüksek kaliteli teknik makaleler önerir. Aynı zamanda, kullanıcılar katkıda bulunabilirler.Makale resmi hesaba dahil edildikten sonra, web sitesinin ana sayfasında önereceğiz. Dikkat Açık kaynak Çin OSC Her gün yüksek kaliteli itin, tıklayın " daha fazlasını anla "Orijinal makaleyi okuyun.

    En iyi Snapdragon 845+ kablosuz şarj Xiaomi MIX 2S cep telefonu resmi olarak piyasaya sürüldü
    önceki
    2018 Küresel Otomotiv AI Konferansı düzenlendi Tencent, yapay zekayı otomotiv endüstrisi ile entegre etmenin yollarını bulmak için akıllıca bir araya geldi
    Sonraki
    Tarihteki en güçlü Xiaomi amiral gemisi ürünü! Xiaomi MIX 2S ilk değerlendirme
    169 yuan! Xiao Ai Speaker Mini resmi olarak piyasaya sürüldü: yapay zeka + ağ hoparlörleri + 200 işlev
    Ülke çapında durdu! Bu tür ilaçlar atılmak üzere
    Xiaomi Mi Gaming Notebook resmi olarak RMB 8,999: i7 + 1060 + 256G SSD için piyasaya sürüldü, fiyat-performans oranı gökyüzüne karşı!
    BGI'nin A hisselerine inmesi, bu 40 kurumun getirisi "buz ve ateş"
    Rus fırlatma aracının ticarileşmesi kazara meydana geldi ve gemideki uyduların hepsi patladı. Rus tarafı: çok utandı
    En iyi Snapdragon 845+ kablosuz şarj Xiaomi MIX 2S cep telefonu resmi olarak piyasaya sürüldü
    Bilim ve teknoloji çevreleri toplu olarak Jin Yong'un yasını tutuyor: iyi kahramanlar! Bir daha asla
    "Love Xi'an" Yantai "Citizens Pact" da yer aldı, Xi'an netizenleri çok hevesli
    Xiaomi Mi MIX 2S resmi olarak 3299 yuan için piyasaya sürüldü: Snapdragon 845+ Xiaoai ses asistanı, çarpıcı kamera kalitesi
    1999 yuan'dan! Huawei nova 3e bugün satışta: tam ekran + Kirin 659, baştan çıkarıldınız mı?
    230.000'den fazla kişi katıldı ve hiçbiri para kazanmadı! Polis on milyarlarca kumar davasını çözdü!
    To Top