日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

从零搭建 dubbogo

發布時間:2024/9/3 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从零搭建 dubbogo 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡介:本文將手把手教你使用 dubbogo 調用 dubbogo 或 dubbo 提供的服務提供方。

作者 | 鐵城??dubbo-go 社區 committer
來源|阿里巴巴云原生公眾號

本文將手把手教你使用 dubbogo 調用 dubbogo 或 dubbo 提供的服務提供方。

前言

本文基于 dubbogo 1.5.4 版本。

最近開始參與 dubbogo 的一些開發測試,之前都是直接拿 samples?的例子驗證功能,而這次為了復現一個功能問題,打算從零開始搭建一個 dubbo-go 和 dubbo 調用的工程,踩到了一些新人使用 dubbogo 的坑,把這個過程記錄下供大家參考。

通過本文你可以了解到:

  • 如何常規配置 dubbogo 消費方去調用 dubbo 和 dubbogo 服務提供方。
  • 通過一個實際的 BUG 介紹解決問題的思路。

解決問題

1. 準備 dubbo 服務提供者

1)基本定義

定義 DemoService 接口:

public interface DemoService {String sayHello(String name);String sayHello(User user);String sayHello(User user, String name);}

定義 User 對象:

public class User implements Serializable {private String name;private int age;...... }

2)啟動 dubbo 服務提供者

用的 dubbo 官方示例代碼:

public static void main(String[] args) throws IOException {// 服務實現DemoService demoService = new DemoServiceImpl();// 當前應用配置ApplicationConfig application = new ApplicationConfig();application.setName("demoProvider");// 連接注冊中心配置RegistryConfig registry = new RegistryConfig();registry.setAddress("127.0.0.1:2181");registry.setProtocol("zookeeper");registry.setUsername("");registry.setPassword("");// 服務提供者協議配置ProtocolConfig protocol = new ProtocolConfig();protocol.setName("dubbo");protocol.setPort(12345);protocol.setThreads(200);// 注意:ServiceConfig為重對象,內部封裝了與注冊中心的連接,以及開啟服務端口// 服務提供者暴露服務配置ServiceConfig<DemoService> service = new ServiceConfig<>(); // 此實例很重,封裝了與注冊中心的連接,請自行緩存,否則可能造成內存和連接泄漏service.setApplication(application);service.setRegistry(registry); // 多個注冊中心可以用setRegistries()service.setProtocol(protocol); // 多個協議可以用setProtocols()service.setInterface(DemoService.class);service.setRef(demoService);service.setVersion("1.0.0");service.setGroup("tc");service.setTimeout(60 * 1000);// 暴露及注冊服務service.export();System.in.read(); }

查看 zookeeper 看是否注冊成功:

$ls /dubbo/com.funnycode.DemoService/providers [dubbo%3A%2F%2F127.0.0.1%3A12345%2Fcom.funnycode.DemoService%3Fanyhost%3Dtrue%26application%3DdemoProvider%26deprecated%3Dfalse%26dubbo%3D2.0.2%26dynamic%3Dtrue%26generic%3Dfalse%26group%3Dtc%26interface%3Dcom.funnycode.DemoService%26methods%3DsayHello%26pid%3D18167%26release%3D2.7.7%26revision%3D1.0.0%26side%3Dprovider%26threads%3D200%26timestamp%3D1606896020691%26version%3D1.0.0] ```如上的輸出表示服務提供方已經啟動。## 2. 準備 dubbogo 服務消費者### 1)基本定義定義?`User` 對象:``` type User struct {Name stringAge int }func (User) JavaClassName() string {return "com.funnycode.User" } ```定義 `DemoProvider` 接口:``` type DemoProvider struct {SayHello func(ctx context.Context, name string) (string, error) `dubbo:"sayHello"`SayHello2 func(ctx context.Context, user User) (string, error) `dubbo:"sayHello"`SayHello3 func(ctx context.Context, user User, name string) (string, error) `dubbo:"sayHello"` }func (p *DemoProvider) Reference() string {return "DemoProvider" } ```### 2)啟動 dubbogo 消費者``` func main() {config.Load()gxlog.CInfo("\n\n\nstart to test dubbo")res, err := demoProvider.SayHello(context.TODO(), "tc")if err != nil {panic(err)}gxlog.CInfo("response result: %v\n", res)user := User{Name: "tc",Age: 18,}res, err = demoProvider.SayHello2(context.TODO(), user)if err != nil {panic(err)}gxlog.CInfo("response result: %v\n", res)res, err = demoProvider.SayHello3(context.TODO(), user, "tc")if err != nil {panic(err)}gxlog.CInfo("response result: %v\n", res)initSignal() } ```### 3. 請求結果分析### 1)直接調用> 確認問題的存在。第一個接口的參數是字符串,可以正常返回 `[2020-12-03/18:59:12 main.main: client.go: 29] response result: Hello tc`。第二、三兩個接口存在?`User` 對象,無法調用成功。錯誤信息如下:``` 2020-12-02T17:10:47.739+0800 INFO getty/listener.go:87 session{session session-closed, Read Bytes: 924, Write Bytes: 199, Read Pkgs: 0, Write Pkgs: 1} got error{java exception:Fail to decode request due to: java.lang.IllegalArgumentException: Service not found:com.funnycode.DemoService, sayHelloat org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:134)at org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:80)at org.apache.dubbo.remoting.transport.DecodeHandler.decode(DecodeHandler.java:57)at org.apache.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:44)at org.apache.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:57)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748) }, will be closed.

錯誤正如 issue?中描述的一模一樣,因為錯誤信息返回到了消費端,可以看到 Java 那邊的錯誤堆棧信息,所以直接去看 DecodeableRpcInvocation.decode#134。

2)斷點查看

代碼如下:

// 反序列化 public class DecodeableRpcInvocation extends RpcInvocation implements Codec, Decodeable {public Object decode(Channel channel, InputStream input) throws IOException {......if (serviceDescriptor != null) {// 方法描述里面根據方法名查找MethodDescriptor methodDescriptor = serviceDescriptor.getMethod(getMethodName(), desc);if (methodDescriptor != null) {pts = methodDescriptor.getParameterClasses();this.setReturnTypes(methodDescriptor.getReturnTypes());}}// 表示沒有找到方法 if (pts == DubboCodec.EMPTY_CLASS_ARRAY) {if (!RpcUtils.isGenericCall(path, getMethodName()) && !RpcUtils.isEcho(path, getMethodName())) {throw new IllegalArgumentException("Service not found:" + path + ", " + getMethodName());}pts = ReflectUtils.desc2classArray(desc);}......} }
  • 查看 MethodDescriptor,即找方法是否存在,存在的話就會設置好 ParameterClasses。
  • 如果上面沒找到,pts == DubboCodec.EMPTY_CLASS_ARRAY 就會滿足條件,進而判斷是否是泛化調用或者是 echo 調用,如果都不是則報服務找不到方法錯誤。
  • desc 是 Ljava/lang/Object ,很明顯并沒有參數是 Object 的方法,所以必然是會報錯的。

補充說明:方法查詢。
**
代碼如下:

public MethodDescriptor getMethod(String methodName, String params) {Map<String, MethodDescriptor> methods = descToMethods.get(methodName);if (CollectionUtils.isNotEmptyMap(methods)) {return methods.get(params);}return null; }

優點:比之前的版本加了方法的元信息緩存起來,不使用反射可以提高效率,可以理解用空間換時間。

4. 解決問題

因為直接擼代碼并 hold 不住,所以通過比較來查看問題所在。

1)啟動?dubbo 服務消費者

通過 api 模式啟動,參考官方例子。啟動這個是為了查看 Java 版本的傳輸內容。

public static void main(String[] args) throws InterruptedException {// 當前應用配置ApplicationConfig application = new ApplicationConfig();application.setName("demoProvider2");// 連接注冊中心配置RegistryConfig registry = new RegistryConfig();registry.setAddress("127.0.0.1:2181");registry.setProtocol("zookeeper");registry.setUsername("");registry.setPassword("");// 注意:ReferenceConfig為重對象,內部封裝了與注冊中心的連接,以及與服務提供方的連接// 引用遠程服務ReferenceConfig<DemoService> reference= new ReferenceConfig<>(); // 此實例很重,封裝了與注冊中心的連接以及與提供者的連接,請自行緩存,否則可能造成內存和連接泄漏reference.setApplication(application);reference.setRegistry(registry); // 多個注冊中心可以用setRegistries()reference.setInterface(DemoService.class);reference.setVersion("1.0.0");reference.setGroup("tc");reference.setCheck(true);reference.setTimeout(1000 * 60);// 和本地bean一樣使用xxxServiceDemoService demoService = reference.get(); // 注意:此代理對象內部封裝了所有通訊細節,對象較重,請緩存復用System.out.println(demoService.sayHello(new User("tc", 18)));TimeUnit.MINUTES.sleep(10); }

desc 肉眼可見的是?Lcom/funnycode/User,這個就是正確的對象了。

2)查找 dubbogo 為什么不對

代碼位置:
protocol/dubbo/impl/hessian.go:120#marshalRequest

代碼實現:

func marshalRequest(encoder *hessian.Encoder, p DubboPackage) ([]byte, error) {service := p.Servicerequest := EnsureRequestPayload(p.Body)encoder.Encode(DEFAULT_DUBBO_PROTOCOL_VERSION)encoder.Encode(service.Path)encoder.Encode(service.Version)encoder.Encode(service.Method)args, ok := request.Params.([]interface{})if !ok {logger.Infof("request args are: %+v", request.Params)return nil, perrors.Errorf("@params is not of type: []interface{}")}types, err := getArgsTypeList(args)if err != nil {return nil, perrors.Wrapf(err, " PackRequest(args:%+v)", args)}encoder.Encode(types)for _, v := range args {encoder.Encode(v)}...... }

斷點可以發現,types 返回的時候就已經是 Object 了,沒有返回 User,那么繼續跟進去查看代碼。

  • protocol/dubbo/impl/hessian.go:394#getArgsTypeList
  • protocol/dubbo/impl/hessian.go:418#getArgType
func getArgType(v interface{}) string {// 常見的類型處理......default:t := reflect.TypeOf(v)if reflect.Ptr == t.Kind() {t = reflect.TypeOf(reflect.ValueOf(v).Elem())}switch t.Kind() {case reflect.Struct:return "java.lang.Object"}...... }

很明顯當發現是 reflect.Struct 的時候就返回了 java.lang.Object,所以參數就變成了 Object,那么因為 Java?代碼那邊依賴這個類型所以就調用失敗了。

3)其它版本驗證

因為反饋是 2.7.7 出錯,所以先考慮到在之前的版本是否功能正常,于是把服務提供者切換到 dubbo 2.7.3,發現調用仍然有錯誤,如下:

2020-12-02T21:52:25.945+0800 INFO getty/listener.go:85 session{session session-closed, Read Bytes: 4586, Write Bytes: 232, Read Pkgs: 0, Write Pkgs: 1} got error{java exception:org.apache.dubbo.rpc.RpcException: Failed to invoke remote proxy method sayHello to registry://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=demoProvider&dubbo=2.0.2&export=dubbo%3A%2F%2F192.168.0.113%3A12345%2Fcom.funnycode.DemoService%3Fanyhost%3Dtrue%26application%3DdemoProvider%26bind.ip%3D192.168.0.113%26bind.port%3D12345%26deprecated%3Dfalse%26dubbo%3D2.0.2%26dynamic%3Dtrue%26generic%3Dfalse%26group%3Dtc%26interface%3Dcom.funnycode.DemoService%26methods%3DsayHello%26pid%3D23889%26register%3Dtrue%26release%3D2.7.3%26revision%3D1.0.0%26side%3Dprovider%26threads%3D200%26timeout%3D60000%26timestamp%3D1606916702204%26version%3D1.0.0&pid=23889&registry=zookeeper&release=2.7.3&timestamp=1606916702193, cause: Not found method "sayHello" in class com.funnycode.DemoServiceImpl. org.apache.dubbo.rpc.RpcException: Failed to invoke remote proxy method sayHello to registry://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=demoProvider&dubbo=2.0.2&export=dubbo%3A%2F%2F192.168.0.113%3A12345%2Fcom.funnycode.DemoService%3Fanyhost%3Dtrue%26application%3DdemoProvider%26bind.ip%3D192.168.0.113%26bind.port%3D12345%26deprecated%3Dfalse%26dubbo%3D2.0.2%26dynamic%3Dtrue%26generic%3Dfalse%26group%3Dtc%26interface%3Dcom.funnycode.DemoService%26methods%3DsayHello%26pid%3D23889%26register%3Dtrue%26release%3D2.7.3%26revision%3D1.0.0%26side%3Dprovider%26threads%3D200%26timeout%3D60000%26timestamp%3D1606916702204%26version%3D1.0.0&pid=23889&registry=zookeeper&release=2.7.3&timestamp=1606916702193, cause: Not found method "sayHello" in class com.funnycode.DemoServiceImpl.at org.apache.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:107)at org.apache.dubbo.config.invoker.DelegateProviderMetaDataInvoker.invoke(DelegateProviderMetaDataInvoker.java:56)at org.apache.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:56)at org.apache.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:55)at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:82)at org.apache.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:92)at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:82)at org.apache.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:48)at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:82)at org.apache.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:81)at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:82)at org.apache.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:96)at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:82)at org.apache.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:148)at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:82)at org.apache.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38)at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:82)at org.apache.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:41)at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:82)at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$CallbackRegistrationInvoker.invoke(ProtocolFilterWrapper.java:157)at org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:152)at org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:102)at org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:193)at org.apache.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:51)at org.apache.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:57)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748) Caused by: org.apache.dubbo.common.bytecode.NoSuchMethodException: Not found method "sayHello" in class com.funnycode.DemoServiceImpl.at org.apache.dubbo.common.bytecode.Wrapper1.invokeMethod(Wrapper1.java)at org.apache.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:47)at org.apache.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:84)... 27 more }, will be closed.

雖然和 2.7.7 的代碼是不一樣的,但是通過錯誤也能看出來是在代理增強類里面方法找不到,大概率是反射找不到方法,所以歸根結底也是參數的問題。

4)修復問題

修復相對簡單,就是拿到 struct 定義的 JavaClassName。

case reflect.Struct:v, ok := v.(hessian.POJO)if ok {return v.JavaClassName()}return "java.lang.Object"

5)驗證結果

再次執行消費者,運行(提供方 2.7.7 和 2.7.3)正常,輸出如下:

[2020-12-03/20:04:06 main.main: client.go: 29] response result: Hello tc ... [2020-12-03/20:04:09 main.main: client.go: 41] response result: Hello tc You are 18 ... [2020-12-03/20:04:09 main.main: client.go: 48] response result: Hello tc You are 18

細節叨叨

1. 如何配置 dubbogo 消費者

細心的你是否已經發現,在我 dubbogo 的消費端接口叫 DemoProvider,然后發現提供者叫 DemoService,這個又是如何正常運行的?

實際上和 client.yml 中配置項 references 有關,在配置文件詳細說明了 interface,version,group 等,你還可以通過 methods 配置方法的超時時間等信息。

references:"DemoProvider":# 可以指定多個registry,使用逗號隔開;不指定默認向所有注冊中心注冊registry: "zk1"protocol: "dubbo"interface: "com.funnycode.DemoService"cluster: "failover"version: "1.0.0"group: "tc"methods:- name: "SayHello"retries: 3......

2. 全局的 group 和 version 怎么配置

配置文件如下:

# application config application:organization: "dubbogoproxy.com"name: "Demo Micro Service"module: "dubbogoproxy tc client"version: "1.0.0"group: "tc"owner: "ZX"environment: "dev"references:"DemoProvider":# 可以指定多個registry,使用逗號隔開;不指定默認向所有注冊中心注冊registry: "zk1"protocol: "dubbo"interface: "com.funnycode.DemoService"cluster: "failover" # version: "1.0.0" # group: "tc"methods:- name: "SayHello"retries: 3

從使用的習慣來講,肯定是 application 表示了全局的配置,但是我發現啟動的時候在 application 配置的 version 和 group 并不會賦值給接口,啟動會報服務提供方找不到,如下:

2020-12-03T20:15:42.208+0800 DEBUG zookeeper/registry.go:237 Create a zookeeper node:/dubbo/com.funnycode.DemoService/consumers/consumer%3A%2F%2F30.11.176.107%2FDemoProvider%3Fapp.version%3D1.0.0%26application%3DDemo+Micro+Service%26async%3Dfalse%26bean.name%3DDemoProvider%26cluster%3Dfailover%26environment%3Ddev%26generic%3Dfalse%26group%3D%26interface%3Dcom.funnycode.DemoService%26ip%3D30.11.176.107%26loadbalance%3D%26methods.SayHello.loadbalance%3D%26methods.SayHello.retries%3D3%26methods.SayHello.sticky%3Dfalse%26module%3Ddubbogoproxy+tc+client%26name%3DDemo+Micro+Service%26organization%3Ddubbogoproxy.com%26owner%3DZX%26pid%3D38692%26protocol%3Ddubbo%26provided-by%3D%26reference.filter%3Dcshutdown%26registry.role%3D0%26release%3Ddubbo-golang-1.3.0%26retries%3D%26side%3Dconsumer%26sticky%3Dfalse%26timestamp%3D1606997742%26version%3D

version 和 group 都是空。必須把 DemoProvider 下的 version 和 group 注釋打開。

3. 怎么指定調用的方法名

1)go 調用 java

dubbogo 調用 dubbo,因為 go 是大寫的方法名,java 里面是小寫的方法名,所以會出現如下錯誤:

2020-12-02T17:10:47.739+0800 INFO getty/listener.go:87 session{session session-closed, Read Bytes: 924, Write Bytes: 199, Read Pkgs: 0, Write Pkgs: 1} got error{java exception:Fail to decode request due to: java.lang.IllegalArgumentException: Service not found:com.funnycode.DemoService, SayHello java.lang.IllegalArgumentException: Service not found:com.funnycode.DemoService, SayHelloat org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:134)at org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:80)at org.apache.dubbo.remoting.transport.DecodeHandler.decode(DecodeHandler.java:57)at org.apache.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:44)at org.apache.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:57)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748) }, will be closed.

細心的讀者可能已經注意到了,我在消費端的接口聲明是有個 dubbo:"sayHello" 的,表示方法名是 sayHello,這樣在服務提供方就可以得到 sayHello 這個方法名。

還有我聲明的三個方法都指明它們的方法名叫 dubbo:"sayHello",這是因為 Java 可以方法名字一樣進行重載,而 go 是不能方法名重復的。

2)go 調用?go

直接貼能跑通的代碼。

我的提供者接口:

type DemoProvider struct{}func (p *DemoProvider) SayHello(ctx context.Context, name string) (string, error) {return "Hello " + name, nil }func (p *DemoProvider) SayHello4(ctx context.Context, user *User) (string, error) {return "Hello " + user.Name + " You are " + strconv.Itoa(user.Age), nil }func (p *DemoProvider) SayHello5(ctx context.Context, user *User, name string) (string, error) {return "Hello " + name + " You are " + strconv.Itoa(user.Age), nil }func (p *DemoProvider) Reference() string {return "DemoProvider" }func (p *DemoProvider) MethodMapper() map[string]string {return map[string]string{"SayHello": "sayHello",} }

我的消費者接口:

type DemoProvider struct {// 調用 java 和 goSayHello func(ctx context.Context, name string) (string, error) `dubbo:"sayHello"`// 只調用 javaSayHello2 func(ctx context.Context, user *User) (string, error) `dubbo:"sayHello"`SayHello3 func(ctx context.Context, user *User, name string) (string, error) `dubbo:"sayHello"`// 只調用 goSayHello4 func(ctx context.Context, user *User) (string, error)SayHello5 func(ctx context.Context, user *User, name string) (string, error) }

啟動服務消費者:

func main() {config.Load()gxlog.CInfo("\n\n\nstart to test dubbo")res, err := demoProvider.SayHello(context.TODO(), "tc")if err != nil {panic(err)}gxlog.CInfo("response result: %v\n", res)user := &User{Name: "tc",Age: 18,}res, err = demoProvider.SayHello4(context.TODO(), user)if err != nil {panic(err)}gxlog.CInfo("response result: %v\n", res)res, err = demoProvider.SayHello5(context.TODO(), user, "tc")if err != nil {panic(err)}gxlog.CInfo("response result: %v\n", res)initSignal() }

這里需要注意 MethodMapper 方法,有時候需要在這個方法中配置方法名的映射關系,否則還是會出現找不到方法的錯誤。

比如因為配置 dubbo:"sayHello",所以在 go 里面請求 SayHello 變成了 sayHello,那么服務提供方通過 MethodMapper 方法配置后使得提供方也是 sayHello,這樣 go 和 java 下暴露的都是小寫的 sayHello。

4. 為什么會用 hessian2

老司機都懂,在 dubbo 中 SPI 機制的默認值就是 hessian2

@SPI("hessian2") public interface Serialization { }

而在 dubbo-go 中:

func NewDubboCodec(reader *bufio.Reader) *ProtocolCodec {s, _ := GetSerializerById(constant.S_Hessian2)return &ProtocolCodec{reader: reader,pkgType: 0,bodyLen: 0,headerRead: false,serializer: s.(Serializer),} }

5. hessian 序列化源碼

可以自行斷點查看,兩邊基本上一樣,我也是通過兩邊比出來的,RpcInvocation.getParameterTypesDesc() 就是方法的參數.

  • go 代碼 protocol/dubbo/impl/hessian.go:120#marshalRequest
  • java 代碼 org.apache.dubbo.rpc.protocol.dubbo.DubboCodec#encodeRequestData(org.apache.dubbo.remoting.Channel, org.apache.dubbo.common.serialize.ObjectOutput, java.lang.Object, java.lang.String)

6. dubbogo 服務提供者的方法對象需要是指針對象

之前的例子都是 copy 的,這次是純手打的,才發現了這個問題。
如果你的提供類似:func (p *DemoProvider) SayHello4(ctx context.Context, user User) (string, error),那么會出現如下錯誤:

2020-12-03T12:42:32.834+0800 ERROR getty/listener.go:280 OnMessage panic: reflect: Call using *main.User as type main.User github.com/apache/dubbo-go/remoting/getty.(*RpcServerHandler).OnMessage.func1

參數里面的 User 需要改成 *User。

7. dubbogo 服務消費者的方法對象可以是非指針對象

SayHello4 func(ctx context.Context, user *User) (string, error) // or SayHello4 func(ctx context.Context, user User) (string, error)

因為在參數序列化的時候會對指針做操作:

t := reflect.TypeOf(v) if reflect.Ptr == t.Kind() {t = reflect.TypeOf(reflect.ValueOf(v).Elem()) }

完整代碼

8. 配置文件說明

dubbogo 主要有三個配置文件:

  • server.yaml 服務提供方的配置文件
  • client.yaml 服務消費方的配置文件
  • log.yaml 日志文件

如果你什么都不配置,會出現:

2021/01/11 15:31:41 [InitLog] warn: log configure file name is nil 2021/01/11 15:31:41 [consumerInit] application configure(consumer) file name is nil 2021/01/11 15:31:41 [providerInit] application configure(provider) file name is nil

這樣是沒法正常使用的。如果你是服務提供方,必須要配置 server.yaml 文件,如果你是服務消費方,必須要配置 client.yaml,實際我們的應用應該既是消費者又是提供者,所以往往兩個文件都是需要配置的。

服務提供方正常啟動是會有如下輸出的:

2021-01-11T15:36:55.003+0800 INFO protocol/protocol.go:205 The cached exporter keys is dubbo://:20000/DemoProvider?accesslog=&app.version=1.0.0&application=Demo+Micro+Service&auth=&bean.name=DemoProvider&cluster=failover&environment=dev&execute.limit=&execute.limit.rejected.handler=&group=tc&interface=com.funnycode.DemoService&loadbalance=random&methods.SayHello.loadbalance=random&methods.SayHello.retries=3&methods.SayHello.tps.limit.interval=&methods.SayHello.tps.limit.rate=&methods.SayHello.tps.limit.strategy=&methods.SayHello.weight=0&methods.SayHello4.loadbalance=random&methods.SayHello4.retries=3&methods.SayHello4.tps.limit.interval=&methods.SayHello4.tps.limit.rate=&methods.SayHello4.tps.limit.strategy=&methods.SayHello4.weight=0&methods.SayHello5.loadbalance=random&methods.SayHello5.retries=3&methods.SayHello5.tps.limit.interval=&methods.SayHello5.tps.limit.rate=&methods.SayHello5.tps.limit.strategy=&methods.SayHello5.weight=0&module=dubbogoproxy+tc+client&name=Demo+Micro+Service&organization=dubbogoproxy.com&owner=ZX&param.sign=&registry.role=3&release=dubbo-golang-1.3.0&retries=&serialization=&service.filter=echo%2Ctoken%2Caccesslog%2Ctps%2Cgeneric_service%2Cexecute%2Cpshutdown&side=provider&ssl-enabled=false&timestamp=1610350614&tps.limit.interval=&tps.limit.rate=&tps.limit.rejected.handler=&tps.limit.strategy=&tps.limiter=&version=1.0.0&warmup=100! 2021-01-11T15:36:55.003+0800 INFO dubbo/dubbo_protocol.go:86 Export service: dubbo://:20000/DemoProvider?accesslog=&app.version=1.0.0&application=Demo+Micro+Service&auth=&bean.name=DemoProvider&cluster=failover&environment=dev&execute.limit=&execute.limit.rejected.handler=&group=tc&interface=com.funnycode.DemoService&loadbalance=random&methods.SayHello.loadbalance=random&methods.SayHello.retries=3&methods.SayHello.tps.limit.interval=&methods.SayHello.tps.limit.rate=&methods.SayHello.tps.limit.strategy=&methods.SayHello.weight=0&methods.SayHello4.loadbalance=random&methods.SayHello4.retries=3&methods.SayHello4.tps.limit.interval=&methods.SayHello4.tps.limit.rate=&methods.SayHello4.tps.limit.strategy=&methods.SayHello4.weight=0&methods.SayHello5.loadbalance=random&methods.SayHello5.retries=3&methods.SayHello5.tps.limit.interval=&methods.SayHello5.tps.limit.rate=&methods.SayHello5.tps.limit.strategy=&methods.SayHello5.weight=0&module=dubbogoproxy+tc+client&name=Demo+Micro+Service&organization=dubbogoproxy.com&owner=ZX&param.sign=&registry.role=3&release=dubbo-golang-1.3.0&retries=&serialization=&service.filter=echo%2Ctoken%2Caccesslog%2Ctps%2Cgeneric_service%2Cexecute%2Cpshutdown&side=provider&ssl-enabled=false&timestamp=1610350614&tps.limit.interval=&tps.limit.rate=&tps.limit.rejected.handler=&tps.limit.strategy=&tps.limiter=&version=1.0.0&warmup=100

9. 復現代碼

  • https://github.com/cityiron/java_study/tree/master/dubbo2.7.7/dg-issue900

  • https://github.com/cityiron/golang_study/tree/master/dubbogo/1.5.4/arg-bug

參考

  • https://dubbo.apache.org/zh/docs/v2.7/user/configuration/api/

  • https://github.com/apache/dubbo-go/issues/257

篇幅有限,就介紹到這里。歡迎有興趣的同學參與 dubbogo3.0 的建設,感謝閱讀。如果你有任何疑問,歡迎釘釘搜索群號:31363295,加入交流群。

作者簡介

鐵城(GithubID cityiron),dubbo-go 社區 committer,主要參與 dubbo-go 1.5 版本迭代、 dubbo-go 3.0 服務路由和云原生方面工作、以及 dubbo-go-proxy 項目負責人。擅長使用 Java/Go 語言,專注于云原生和微服務等技術方向。

原文鏈接:https://developer.aliyun.com/article/781292?

版權聲明:本文內容由阿里云實名注冊用戶自發貢獻,版權歸原作者所有,阿里云開發者社區不擁有其著作權,亦不承擔相應法律責任。具體規則請查看《阿里云開發者社區用戶服務協議》和《阿里云開發者社區知識產權保護指引》。如果您發現本社區中有涉嫌抄襲的內容,填寫侵權投訴表單進行舉報,一經查實,本社區將立刻刪除涉嫌侵權內容。

總結

以上是生活随笔為你收集整理的从零搭建 dubbogo的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

中文在线a在线 | 91在线精品视频 | 日韩精品久久久久久久电影99爱 | 免费在线观看不卡av | 色姑娘综合 | 亚洲人人射 | 亚洲精品在线观看中文字幕 | 欧美aaaxxxx做受视频 | 欧美日韩在线免费观看视频 | 久久在线精品视频 | 精品免费99久久 | 在线精品视频在线观看高清 | 国产 日韩 在线 亚洲 字幕 中文 | 美女av电影 | 日韩免费电影网 | 国产亚洲婷婷免费 | 日本特黄一级 | 国产高清久久 | 国产成人久久av免费高清密臂 | 国产 日韩 中文字幕 | 黄色三级在线 | 天天插综合 | 全黄色一级片 | 亚洲国产日韩欧美 | 久久夜色精品国产欧美乱 | 亚洲一级性 | 欧美一级欧美一级 | 国产永久网站 | 久久婷婷国产色一区二区三区 | 色婷婷成人网 | 久久99热这里只有精品国产 | 99视频精品 | 国产亚洲精品久久久久久网站 | 国产热re99久久6国产精品 | 久久伊人国产精品 | 国产一区网| 九九有精品 | 91九色视频国产 | 久久蜜臀av| 日韩伦理片一区二区三区 | 国产又黄又爽又猛视频日本 | av福利在线免费观看 | 国产精品入口66mio女同 | 五月婷婷一区 | 久久久久免费精品国产 | 国产精品免费观看网站 | 综合天堂av久久久久久久 | 日韩av男人的天堂 | 一级a毛片高清视频 | 中文字幕亚洲情99在线 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 久久刺激视频 | 国产精品入口久久 | 免费看十八岁美女 | 超碰人人av | 国产一级免费视频 | 久久高清毛片 | 精品视频久久 | 最近日本韩国中文字幕 | 欧美日韩精 | 久久草草热国产精品直播 | 欧美精品久久久久久久久久白贞 | 色综合久久久久综合体 | 日本久久精 | 免费一级片观看 | 91久久黄色| 国偷自产中文字幕亚洲手机在线 | 最近高清中文在线字幕在线观看 | 99精品在线直播 | 98福利在线 | 国产麻豆精品免费视频 | 国产精品在线看 | 久精品视频 | 九九久久成人 | 美女视频免费精品 | 久久五月天婷婷 | 久久精品99久久久久久2456 | 激情视频免费在线 | 丁香资源影视免费观看 | 国产资源精品在线观看 | 婷婷亚洲五月色综合 | 开心激情网五月天 | 黄a网站| 国产日韩精品欧美 | 2018亚洲男人天堂 | 91成人久久| 四虎www com | 黄色a视频免费 | 成人免费视频网站 | 91亚洲永久精品 | 亚洲免费国产视频 | 成人免费观看视频网站 | 丁香网婷婷 | 五月婷婷激情综合网 | 亚一亚二国产专区 | a√资源在线| 亚洲激情电影在线 | 黄色网在线播放 | 久久免费黄色 | 又黄又爽又刺激视频 | 日韩精品免费在线观看视频 | 欧美另类调教 | 日韩免费视频线观看 | 国产资源中文字幕 | 国产精品观看 | 日韩天天综合 | 国产在线精| 日韩手机在线 | 成人免费网视频 | 日韩精品免费一区 | 国产中文字幕大全 | 亚洲在线激情 | 91成人精品一区在线播放69 | 亚洲欧美国产精品久久久久 | 中文字幕888| 国产精品视频免费观看 | 成人欧美一区二区三区黑人麻豆 | 色网址99 | 91在线91 | 狠狠狠狠狠干 | 日韩中文字幕视频在线 | 九月婷婷人人澡人人添人人爽 | 久草视频播放 | 久久福利 | a午夜电影 | 黄网站色视频免费观看 | 99视频这里有精品 | 久久精品视频免费 | 中文字幕精品三区 | 男女靠逼app | 91久久影院 | 国语精品免费视频 | 国产日韩精品一区二区 | 欧美另类巨大 | 亚洲精品美女 | 99欧美视频 | 亚洲成人免费 | 亚洲精品tv久久久久久久久久 | 国产无吗一区二区三区在线欢 | 天堂av在线免费 | 另类老妇性bbwbbw高清 | 国产精品久久久久久欧美 | av在线播放亚洲 | 九九天堂| 九色精品免费永久在线 | 91九色在线视频 | 欧美日本不卡视频 | 欧美乱码精品一区 | 日韩中文字幕免费在线观看 | 欧美五月婷婷 | 久久伊人色综合 | 操久在线| 麻豆系列在线观看 | 中文字幕黄色网址 | 欧美日bb | 久久免费电影网 | 婷婷在线免费观看 | 久久99久国产精品黄毛片入口 | 在线观看黄污 | 一区二区精品在线 | 中午字幕在线 | 91精品在线视频 | 成人在线播放免费观看 | 福利视频区 | 在线播放一区 | 日韩视频免费看 | 天天色播 | 天天操网 | 69av在线播放 | 国产视| 欧美极品少妇xxxx | 久久黄色网页 | 黄色资源在线观看 | 人人爽人人爽人人爽学生一级 | 亚洲视频在线免费看 | 三级黄色在线观看 | 成年人看片 | 免费特级黄色片 | 激情网在线视频 | 国产精品你懂的在线观看 | 久久黄色网址 | 久久久国产精品电影 | 亚洲六月丁香色婷婷综合久久 | 国产一区二区在线视频观看 | 手机看片国产日韩 | 国产免费叼嘿网站免费 | 国产亚洲精品久久久久久无几年桃 | 国产免码va在线观看免费 | 亚洲精品福利在线观看 | 国产中文自拍 | 国产日产av | 欧美日韩高清一区二区 国产亚洲免费看 | 亚洲国内精品视频 | 成人av资源在线 | 日韩乱码在线 | av中文国产 | 国产日产精品久久久久快鸭 | 色香天天 | 99热999| 日韩久久久久久久久 | 欧美激情综合色 | 亚洲精品免费在线视频 | 九九三级毛片 | 免费看污在线观看 | 午夜少妇 | 欧美做受高潮1 | 欧美淫aaa免费观看 日韩激情免费视频 | 国产亚洲aⅴaaaaaa毛片 | 午夜三级毛片 | 久草国产在线 | 在线免费色视频 | 麻豆视频免费观看 | 日韩va亚洲va欧美va久久 | 日本不卡一区二区 | 久久99热国产 | 日日添夜夜添 | 激情深爱五月 | 午夜 久久 tv | 久久久久日本精品一区二区三区 | 亚洲一区美女视频在线观看免费 | 久久精品中文字幕 | 国产中出在线观看 | 亚洲在线黄色 | 亚洲成人精品久久久 | 丁香六月天婷婷 | 亚洲精品在线免费 | 精品久久久久久一区二区里番 | 麻豆精品视频在线观看免费 | 久久人人97超碰com | 久久综合九色欧美综合狠狠 | 91视频88av | 色综合亚洲精品激情狠狠 | 国产亚洲精品久久久网站好莱 | 国产视频黄 | 99产精品成人啪免费网站 | 国产高清日韩欧美 | 91九色成人蝌蚪首页 | 一区二区视频免费在线观看 | 在线播放视频一区 | 亚洲精品在线观看中文字幕 | 中文字幕国语官网在线视频 | 九九爱免费视频 | 久久精品久久精品久久精品 | 亚洲精品乱码白浆高清久久久久久 | 日本久久久久久科技有限公司 | 亚洲精品视频免费在线观看 | 国产在线观看99 | 日韩在线观看你懂得 | 91视频啪 | 久久国产亚洲精品 | 久久视频在线视频 | 中文字幕av日韩 | 中文网丁香综合网 | 免费黄色在线网站 | 国产在线观看二区 | 午夜av在线播放 | av色网站 | 一区二区三区四区五区在线 | 久久综合九色综合欧美就去吻 | 久草国产精品 | 天天干,狠狠干 | 最近中文字幕高清字幕免费mv | av中文资源在线 | 国内丰满少妇猛烈精品播放 | 手机看片福利 | 久久污视频 | 91精品国产福利在线观看 | 国产成人一区二区三区影院在线 | 在线观看视频免费大全 | 欧美成人精品三级在线观看播放 | 91污在线观看| 好看的国产精品视频 | 国产精品 9999 | 久久成人18免费网站 | 国产精品自产拍在线观看桃花 | 又湿又紧又大又爽a视频国产 | 免费国产在线视频 | 国产一区91| 欧美色噜噜噜 | 一区二区三区在线观看 | 色综合久久天天 | 国产黄色视| 久久超碰99 | 91麻豆精品| 久久精品国产v日韩v亚洲 | 九九久久久久99精品 | 日韩精品中文字幕一区二区 | 国产精品久久久999 国产91九色视频 | 中文字幕亚洲五码 | 国产黄色成人 | 亚洲在线黄色 | 97成人精品视频在线播放 | 国产黄| 日韩av影片在线观看 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 日本黄色免费电影网站 | 国产亚洲精品久久久久久移动网络 | 精品国产一区二区三区久久影院 | 激情婷婷色 | 精品自拍网 | 91日韩在线专区 | 精选久久 | 激情开心站 | 91资源在线观看 | 国产美女免费观看 | 特级a毛片 | 国产一区二区三区 在线 | 午夜视频福利 | www.色五月.com| 亚洲精品久久在线 | 久久99精品久久久久婷婷 | 亚洲精品99久久久久中文字幕 | 成人在线观看影院 | 久久久黄色| 久久久精品在线观看 | 99精品视频在线观看免费 | 欧美精品在线观看一区 | 丝袜少妇在线 | 久草在线观看资源 | 久久精品久久99精品久久 | 一级片黄色片网站 | 色噜噜色噜噜 | 91理论电影 | 99国产精品一区二区 | 天天操综合网站 | 婷婷丁香色综合狠狠色 | 国产天天爽 | 97精品国产97久久久久久 | 亚洲午夜久久久影院 | 麻豆av电影 | av网站在线观看免费 | 香蕉网在线播放 | 在线中文字幕网站 | 国产免费小视频 | 国产精品高清在线观看 | 亚洲成av人电影 | 成人黄色电影在线播放 | 91成人欧美 | 在线看一级片 | 亚洲色图22p| 免费高清在线一区 | 久久99国产精品视频 | 久久久久网址 | 五月婷久| 精品国产一区二 | 久久99久久99精品免观看粉嫩 | 欧美日韩在线视频免费 | 日韩免费电影一区二区 | 久久久精品视频网站 | 免费高清在线观看成人 | www.伊人网 | 免费国产视频 | 亚洲精品免费在线 | 天天干天天天天 | 亚洲毛片在线观看. | 国产在线精品一区二区 | 色九九影院 | 91片黄在线观看 | av专区在线| 国产福利一区二区三区在线观看 | 欧美成年黄网站色视频 | 久久久久亚洲精品国产 | 亚洲精品在线观看中文字幕 | 2019天天干夜夜操 | 一区二区理论片 | 丝袜制服综合网 | 免费看污污视频的网站 | 久久久国产精品亚洲一区 | 996久久国产精品线观看 | 日韩在线第一区 | av成人免费| 色婷婷福利视频 | av成人亚洲 | 国产视频久久久久 | 日韩激情第一页 | 久草在线中文888 | 国产精品九色 | 欧美成年黄网站色视频 | 在线一区电影 | 婷婷激情av | 国产成人精品一区二区三区网站观看 | 99精品国产免费久久 | 天天激情站 | 久久久精品网 | 六月久久婷婷 | mm1313亚洲精品国产 | 人成免费网站 | 日韩免费电影一区二区三区 | 欧美ⅹxxxxxx | 少妇bbbb| www.夜夜操 | 92国产精品久久久久首页 | 91香蕉国产在线观看软件 | 中午字幕在线观看 | 国内精品久久久精品电影院 | 日韩欧美精品一区 | 在线免费观看国产黄色 | 欧美日韩午夜 | 在线观看免费91 | 九九在线国产视频 | 国产黄在线播放 | 激情五月婷婷综合 | 精品免费国产一区二区三区四区 | 久综合网 | 毛片网在线播放 | 国产成人精品女人久久久 | 91豆麻精品91久久久久久 | 国产精品视频专区 | 欧美一区二区三区在线看 | 成人免费在线看片 | 激情网色 | 久久综合五月 | 麻豆视频免费在线播放 | 国产精品爽爽久久久久久蜜臀 | 欧美精品999 | 免费看成人av | 香蕉影院在线 | 国产精品视频永久免费播放 | 国产精品乱码久久久久 | 免费情趣视频 | 久久黄色免费视频 | 91av观看| 久久久久久免费毛片精品 | av综合站 | 国产精品黑丝在线观看 | 天天伊人狠狠 | 亚洲精品视频在线免费 | 日韩城人在线 | 中文字幕人成乱码在线观看 | 亚洲日韩精品欧美一区二区 | 精品国产成人在线影院 | 精品久久久影院 | 国产91av视频在线观看 | 免费看的av片 | 欧洲成人免费 | 黄色免费网站下载 | 1024在线看片 | 天天综合网 天天综合色 | 欧美激情精品久久久久 | 亚洲一区二区三区毛片 | 亚洲毛片一区二区三区 | 蜜臀av一区二区 | 丁香婷婷色 | 97人人看 | 成人av电影免费在线观看 | 五月婷婷视频在线 | 欧美色图亚洲图片 | www久久国产 | 亚洲传媒在线 | 在线免费观看视频一区 | av免费成人 | 国产精品久久久久久妇 | 欧美日韩高清在线一区 | 美女视频黄是免费的 | 最近日本字幕mv免费观看在线 | 色在线视频网 | 欧美精品乱码久久久久 | 欧美国产精品一区二区 | 亚欧洲精品视频在线观看 | 国产97在线观看 | 国产精品午夜免费福利视频 | 极品国产91在线网站 | 五月天亚洲婷婷 | 男女视频久久久 | www色| 最近中文字幕免费 | 久久成人在线视频 | 亚洲日本va午夜在线电影 | 97超碰人人澡人人爱 | 91麻豆精品国产91久久久使用方法 | 九九热re| 国产黄a三级三级 | 久久国产精品系列 | 涩av在线| 国产福利91精品张津瑜 | 国产精品理论片 | 久久99久久99精品免视看婷婷 | 胖bbbb搡bbbb擦bbbb| 亚洲国产精品久久久 | 九九九九精品九九九九 | 欧美精品久久久久久久久久久 | 国产视频亚洲精品 | 婷婷丁香花五月天 | www.香蕉视频在线观看 | 日日爽夜夜爽 | 欧美一级黄色片 | sesese图片| 97在线观看免费高清完整版在线观看 | 中文字幕一区av | 国产精品久久久久久欧美 | 天天操天天干天天爽 | 日韩精品一区电影 | 毛片在线网 | 国产精品视频内 | 国产精品国产精品 | 亚洲激精日韩激精欧美精品 | 国产99久久久精品视频 | 久草在线看片 | 亚洲h色精品 | av高清一区二区三区 | 国产成年免费视频 | 成人国产精品一区二区 | 国产精品久久久久久久久软件 | 国产精品成人一区二区三区 | 久久国产欧美日韩 | 免费av网址大全 | 18久久久 | 亚洲国产视频直播 | 热久久免费视频精品 | 亚洲禁18久人片 | 91视频专区| 免费看的黄色录像 | 日韩精品视频在线观看网址 | 亚洲黄色大片 | 成人综合婷婷国产精品久久免费 | 亚洲黄色成人网 | 亚洲天堂网视频在线观看 | 日韩黄色中文字幕 | 亚洲欧美日韩国产 | 伊人亚洲精品 | 日本少妇高清做爰视频 | 中文字幕一区在线观看视频 | 日韩在线视频播放 | 亚洲最大激情中文字幕 | 人人干狠狠操 | 992tv在线观看 | 99久久婷婷国产精品综合 | 色婷婷www | 成年人免费电影 | av成人在线看| 亚洲伊人第一页 | 成年人免费av | 亚洲欧美在线综合 | 国产精品永久免费在线 | 99精品在线视频播放 | 99热在线精品观看 | 亚洲国产日韩一区 | 国产成人一区二区三区在线观看 | 97在线免费观看 | 国产一级片久久 | 久久久精品99 | 人人干干人人 | 免费看v片| 国产精品入口传媒 | 精品国产一区二区三区免费 | 精品国产乱码久久久久久浪潮 | 欧美最新另类人妖 | 亚洲欧洲国产精品 | 久久久综合九色合综国产精品 | 国产中文字幕在线播放 | 九九热在线观看 | 啪啪肉肉污av国网站 | 97色涩| 午夜精品视频免费在线观看 | 久久精品久久99精品久久 | 在线观看黄网 | 久久福利 | 亚洲精品中文在线观看 | 精品国产免费一区二区三区五区 | 亚洲午夜小视频 | 五月天最新网址 | 久久精品一级片 | 91精品久久久久久久久久久久久 | 婷婷久久五月天 | 亚洲乱亚洲乱亚洲 | 久久在线免费 | 中文字幕制服丝袜av久久 | 麻豆91在线看 | 久久这里只有精品1 | 人人爽人人射 | 操一草 | 91精品老司机久久一区啪 | 国产精品一区在线观看 | 韩国精品一区二区三区六区色诱 | 国产精品免费久久久久久久久久中文 | 久久新视频| 国产乱码精品一区二区三区介绍 | 久久久久久久久电影 | 日韩美女免费线视频 | www.黄色网.com | 欧美色图亚洲图片 | 在线三级播放 | 精品在线观看国产 | 欧美在线观看视频免费 | 又爽又黄在线观看 | 99久久久久成人国产免费 | 91麻豆精品91久久久久同性 | 免费色视频在线 | 一本一道久久a久久精品 | 国产精品一区二区免费视频 | av亚洲产国偷v产偷v自拍小说 | 国产色道 | 国产亚洲精品精品精品 | 午夜婷婷网 | 亚洲男男gaygay无套同网址 | 成人97视频 | 在线观看国产www | 日韩日韩日韩日韩 | 六月激情丁香 | 久久这里只有精品9 | 日韩网站在线免费观看 | 91av在线不卡 | 成人在线一区二区三区 | 又黄又爽又无遮挡免费的网站 | 国产喷水在线 | 91在线免费播放视频 | 天天综合天天做天天综合 | 亚洲91视频 | 天天干天天操天天干 | 国产视频一| 天天爱天天射天天干天天 | 久久精品中文字幕一区二区三区 | 日日色综合 | 欧美午夜激情网 | 天天五月天色 | 91视频3p| 日韩一区二区三区高清免费看看 | av福利在线| 91在线区 | 国产成人l区 | 亚洲美女精品区人人人人 | 久久久久久久精 | 国产高清在线一区 | 麻豆国产精品va在线观看不卡 | 91完整版 | www五月| 欧美日韩在线精品一区二区 | 91亚色免费视频 | 亚洲影院天堂 | 久久久久欠精品国产毛片国产毛生 | 91久久久久久久一区二区 | 夜夜操天天操 | 午夜精选视频 | 国产美腿白丝袜足在线av | 欧美日韩在线电影 | 天天操天天射天天操 | 亚洲午夜小视频 | 欧美日韩在线第一页 | 亚洲国产精品va在线看黑人 | 日韩精品免费一区二区 | 久久久久影视 | 一区二区在线影院 | 久久国产网 | 在线成人高清电影 | 国产成人精品久久二区二区 | 手机av在线网站 | 麻豆精品在线 | 美女网站一区 | 黄色精品网站 | 中文字幕在线高清 | 人人dvd | 五月婷婷中文网 | 91成人精品一区在线播放 | 欧美成人一区二区 | 久久久 精品 | 日韩精品一区二区三区水蜜桃 | 欧美成人在线免费观看 | 在线免费观看涩涩 | 91麻豆精品国产91久久久久久 | 国产精品视频久久 | 色噜噜在线观看视频 | 欧美一级黄大片 | 成人av中文字幕在线观看 | 久久精品视频在线看 | 国产高清在线一区 | 狠狠狠狠干 | 亚洲精品在| 在线观看中文字幕亚洲 | 蜜臀久久99静品久久久久久 | 国产97色在线 | 欧美肥妇free | 国产999免费视频 | 日韩国产高清在线 | 操操操天天操 | 精品国产一区二区三区噜噜噜 | 久久这里 | 99精品在线视频观看 | 波多野结衣精品 | 国产午夜精品av一区二区 | 最新超碰| 精品国精品自拍自在线 | 欧美亚洲一区二区在线 | 亚洲情感电影大片 | 国产成本人视频在线观看 | 久久久久成人精品免费播放动漫 | 久久人人爽人人片av | 欧美成人一区二区 | 91一区啪爱嗯打偷拍欧美 | 最新的av网站 | 九九综合在线 | 久爱精品在线 | 国产亚洲欧美在线视频 | 亚洲国产精品激情在线观看 | 人人爽影院| www.福利 | 激情av综合| 天天躁天天狠天天透 | 在线午夜av | 国产99久久久国产精品免费二区 | 麻豆国产视频 | 免费看一级特黄a大片 | avove黑丝 | 欧美久久久久久久久久久 | 国产1区在线 | 国产在线一区二区 | 免费在线国产视频 | 婷婷亚洲激情 | ,久久福利影视 | 久久五月精品 | 在线观看国产高清视频 | 五月婷婷导航 | 久久中文精品视频 | 欧美久久久久久久久久久久久 | 日韩久久久久久久久 | 狠狠色丁香久久综合网 | 久久久久国产一区二区三区 | 色婷婷福利视频 | 国产一级电影网 | 国产精品久久久久久一二三四五 | 天天操天天舔天天爽 | 又湿又紧又大又爽a视频国产 | 99热这里只有精品免费 | 久久不卡免费视频 | 91成人免费观看视频 | 中文一区二区三区在线观看 | 国产高清不卡在线 | 日韩视频一区二区三区在线播放免费观看 | 五月网婷婷 | 中文字幕色网站 | 午夜少妇一区二区三区 | 国产精品一区二区吃奶在线观看 | 91视频国产高清 | 91社区国产高清 | 欧美日韩成人 | 久精品视频在线观看 | 国产一区在线精品 | 久久精品国产免费 | 麻豆国产精品永久免费视频 | 91亚色免费视频 | 久久婷婷五月综合色丁香 | 狠狠色丁香婷综合久久 | 欧美日韩在线观看一区二区三区 | 一区二区三区四区精品视频 | 欧美日韩不卡一区二区 | 久久九九精品久久 | 成人黄色国产 | 九九99| 91丨九色丨丝袜 | 91麻豆福利 | 欧美午夜精品久久久久 | 日韩在线视频网址 | 激情网五月 | 免费看片网站91 | 日韩精品一区二区三区在线播放 | japanesexxxxfreehd乱熟 | 伊人久久国产 | 久久人91精品久久久久久不卡 | 国产资源在线视频 | 精品99久久 | 久久综合视频网 | 免费看久久 | 91视频麻豆视频 | 成人av观看| 五月天丁香视频 | 美女网站在线免费观看 | 狠狠狠狠狠操 | 欧美人交a欧美精品 | 欧美日韩中文国产 | 九九热有精品 | 国产精品久久久久久久久久久久午夜 | 中文字幕在线专区 | 国产香蕉97碰碰碰视频在线观看 | 国产亚洲精品久久网站 | 欧美精彩视频 | 久草免费新视频 | 日韩av成人在线 | 婷婷色中文字幕 | 激情欧美丁香 | 高清视频一区 | 91精品国产三级a在线观看 | 97超碰人人模人人人爽人人爱 | 欧美怡红院 | 国产成人在线观看免费 | 亚洲六月丁香色婷婷综合久久 | 三上悠亚一区二区在线观看 | 亚洲九九影院 | 国产精品午夜8888 | a视频在线观看免费 | avv天堂| av黄色国产| 91九色porny蝌蚪主页 | 国产在线观看你懂得 | 国产成人99久久亚洲综合精品 | 欧美日韩首页 | 五月天电影免费在线观看一区 | 波多野结衣最新 | 美女免费视频黄 | 国产小视频在线免费观看视频 | 国产精品久久电影观看 | 国产精品av在线免费观看 | 337p日本欧洲亚洲大胆裸体艺术 | 激情电影在线观看 | 精品国产免费一区二区三区五区 | 免费下载高清毛片 | a特级毛片 | 成人在线播放免费观看 | 亚洲伊人第一页 | 国产成人久久精品 | 亚洲精品视频在线免费播放 | 最近中文字幕在线中文高清版 | 国产成人一二片 | 久久国产精品电影 | 日韩三级在线 | 日韩电影久久久 | 国产尤物在线观看 | 九九免费在线观看视频 | 国产高清在线一区 | 依人成人综合网 | 国产无套一区二区三区久久 | 久久久国产一区 | 在线观看国产日韩 | 国产一级在线观看视频 | 一区二区三区福利 | 日韩精品极品视频 | 人人澡人人澡人人 | 精品久久久久久亚洲综合网 | 最近中文字幕国语免费高清6 | 国产麻豆电影 | 在线日韩中文 | 日本公妇色中文字幕 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 97超碰资源总站 | 亚洲精品久久久久中文字幕m男 | 韩日三级在线 | 色视频一区 | 免费av在线网 | 成人免费观看a | 91视频 - v11av | 国产在线播放一区二区三区 | 又黄又爽的免费高潮视频 | 西西444www高清大胆 | 最新av网址大全 | 国产区精品 | 亚洲成人av一区二区 | 精品免费视频123区 午夜久久成人 | 亚洲在线网址 | 超碰在线最新地址 | 中文字幕文字幕一区二区 | 三级a视频| 欧美日韩在线精品一区二区 | 九九视频一区 | 97超碰在线久草超碰在线观看 | 国产大尺度视频 | 久久理论片 | 黄网站色视频免费观看 | 天天射天天射天天 | 日韩中文字幕一区 | 狠狠狠狠干 | 91大神免费视频 | 亚洲国产丝袜在线观看 | 久久视频这里有久久精品视频11 | 日韩av线观看 | 国产一级高清 | 精品久久久久国产免费第一页 | 丁香色婷婷| 成人h视频在线 | 91在线视频免费播放 | 亚洲成aⅴ人在线观看 | 成人啪啪18免费游戏链接 | 成人91视频 | 亚洲成人网av | 国产理论片在线观看 | 国产黄网在线 | 99热99| 91成人短视频在线观看 | 999视频在线观看 | 伊人天天综合 | 五月激情六月丁香 | 欧美日韩一区二区三区在线观看视频 | 久草在线免费看视频 | 在线观看日本韩国电影 | 成人国产精品一区二区 | 日韩成年视频 | 婷婷久久亚洲 | 欧美日韩国产在线 | 午夜免费电影院 | 国产在线观看你懂得 | 91热| 久久精品中文字幕少妇 | 亚洲午夜精品一区二区三区电影院 | 夜夜躁狠狠躁日日躁视频黑人 | 中文字幕在线观看1 | 精品在线视频一区二区三区 | 丰满少妇久久久 | 高清av免费看 | 91桃花视频 | 91大神电影 | www黄在线 | 91在线看视频 | 女人高潮一级片 | 久久理伦片 | 日韩精品免费一线在线观看 | 少妇av片| 亚洲免费专区 | 伊人五月综合 | 免费看亚洲毛片 | 久久久av免费 | 69国产精品视频 | 99久久99| 国产精品美女www爽爽爽视频 | 日韩精品一区二区三区不卡 | 欧美孕妇视频 | 国产剧情一区二区在线观看 | 日韩剧| 欧美午夜剧场 | 欧美另类xxxxx | 91在线看片 | 中文字幕在线观看视频免费 | www最近高清中文国语在线观看 | 日本三级大片 | 日本精品中文字幕在线观看 | 正在播放一区二区 | 夜添久久精品亚洲国产精品 | 欧美va电影 | 亚洲成a人片综合在线 | 欧美大香线蕉线伊人久久 | 日日干美女 | 国产 字幕 制服 中文 在线 | 最新国产福利 | 国产精品色婷婷 | 久久手机视频 | 免费日韩电影 | 亚洲精品一区二区三区在线观看 | 最新av在线免费观看 | 国产原创中文在线 | 91av短视频 | 日韩精品在线视频免费观看 | 91人人网 | 97免费 | 婷婷色狠狠 | 果冻av在线 | 91大神电影 | 手机看片中文字幕 | 在线精品一区二区 | 黄色国产区| 天天操夜夜操 | 欧美精品久久久久久久久老牛影院 | 亚洲最大免费成人网 | 久久免费视频在线观看6 | 在线免费av网 | 91高清在线 | 天天干天天草天天爽 | 亚洲aⅴ久久精品 | 片网址 | 亚洲精品美女视频 | 天天色天天射天天操 | 久久综合久久综合久久综合 | 日日操日日插 | 夜夜视频 | 久久久免费看片 | 99久久www免费 | 日韩av电影一区 | 日韩在线视频免费播放 | 伊人中文在线 | 国产精品99久久久久人中文网介绍 | 婷婷六月激情 | 免费美女av | 国产 色| 日韩免费在线观看视频 | 久久99精品久久只有精品 | 久久久久国产精品视频 | 国产激情久久久 | 成人资源在线播放 | 日日夜夜艹 | 国产精品久久嫩一区二区免费 | 伊人五月天av | 国内精品久久久久影院男同志 | 久久黄色免费 | 国产在线999 | 久久永久视频 | 黄色毛片视频免费观看中文 | 六月天综合网 | 黄色片网站免费 | 午夜电影一区 | 天天天天天天天操 | 黄色大全免费网站 | 黄色免费观看视频 | 黄色在线网站噜噜噜 | 欧美成人日韩 | 久久9999久久 | 国产精品久久毛片 | 欧美天天综合网 | 精品二区视频 | 日韩视频免费 | 亚洲日韩欧美一区二区在线 | 九九热.com| 成人在线免费视频 | 日韩av在线影视 |