您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

图解Dubbo,六种扩展机制详解

时间:2023-04-12 11:32:01  来源:微信公众号  作者:哪吒编程

今天详细的分解一下Dubbo的扩展机制,实现快速入门,丰富个人简历,提高面试level,给自己增加一点谈资,秒变面试小达人,BAT不是梦。

说真的,从零学习Dubbo,看这个系列足够了,共10篇,欢迎持续关注,相约每天早八点

三分钟你将学会:

  1. Dubbo的自适应扩展机制
  2. Dubbo的SPI扩展机制
  3. Dubbo的自定义扩展点机制
  4. Dubbo的过滤器扩展机制
  5. Dubbo的负载均衡扩展机制;
  6. Dubbo的容错机制扩展;

一、Dubbo扩展机制的概述

Dubbo是一个高性能的分布式服务框架,广泛应用于各种规模和种类的企业级项目中。在实际应用过程中,Dubbo的核心能力是扩展机制,它可以让Dubbo具有更强的可定制化能力,也可以让Dubbo更好地适应各种应用场景。

图片

Dubbo的扩展机制

Dubbo的扩展机制主要包括:自适应扩展机制、SPI扩展机制、自定义扩展点机制、过滤器扩展机制、负载均衡扩展机制和容错机制扩展

这些机制使得Dubbo的使用更加灵活方便,可以满足不同需要的业务场景,也可以根据实际情况来选择合适的扩展机制。

在Dubbo的扩展机制中,尤其需要注意自定义扩展点机制和SPI扩展机制。这些机制是Dubbo中较为重要和常用的扩展机制,充分了解这些机制可以让应用程序更加灵活和可定制。

下图展示了Dubbo扩展机制的调用流程:

图片

Dubbo扩展机制

上图中,Dubbo客户端首先会通过ExtensionLoader加载需要使用的扩展点,ExtensionLoader会根据客户端传入的扩展点名和配置,创建对应的扩展点实例,并返回给客户端,客户端再通过返回的扩展点实例调用相应的方法。

二、Dubbo的自适应扩展机制

1、什么是自适应扩展机制

自适应扩展机制是Dubbo提供的一种机制,它可以使Dubbo框架根据实际使用情况动态地选择不同的扩展实现,从而达到最优的效果。

​自适应扩展机制的实现方式是通过在扩展接口的代理类中,根据实际情况动态地生成对应扩展实现的代理类实例。

下图是自适应扩展机制的详细时序图:

图片

自适应扩展机制

上图中:

  1. Client先调用ExtensionLoader加载扩展点,并解析配置文件;
  2. ExtensionLoader根据配置文件查找实现类
  3. 然后创建一个AdaptiveExtension的代理对象,并将该代理对象返回给Client;
  4. Client调用代理对象的方法时,AdaptiveExtension会根据配置使用具体的扩展点实现,并将调用转发给具体的扩展点实现;
  5. 最后将结果返回给Client;

2、自适应扩展机制的使用示例

在Dubbo框架中,有一个名为Protocol的扩展接口,它有多种不同的实现方式,如dubbo、rmi、http等。在使用Dubbo时,我们可以通过@Reference注解来注入对应的扩展实现,如:

@Reference(protocol = "dubbo")
private DemoService demoService;
 

在上述代码中,我们指定了使用dubbo协议的DemoService接口的扩展实现。

我们也可以通过adaptive属性来实现自适应调用,如:

@Reference(adaptive = "true")
private Protocol protocol;

 

在上述代码中,我们使用了adaptive属性,并注入了Protocol类型的实例。这时,Dubbo框架会根据实际情况动态地生成对应实现的代理类,并返回对应的实例。

三、Dubbo的SPI扩展机制

1、什么是SPI扩展机制

Dubbo使用了JAVA的SPI(Service Provider Interface)扩展机制。SPI是JDK内置的一种服务发现机制,其具体实现方式是在资源文件META-INF/services中通过名称为SPI接口的全限定类名创建一个文本文件,在这个文本文件中可以写入该SPI接口的实现类全限定类名,这样可以实现动态加载实现类的目的。

​Dubbo中的SPI扩展机制能够在不修改核心源代码的前提下,通过修改配置文件或者实现自定义拓展类的方式来替换或增加核心功能。

下图描述了 Dubbo SPI 扩展机制的工作流程:

图片

SPI 扩展机制

上图描述了 Dubbo SPI 扩展机制的工作流程,其中:

  1. 用户向 Dubbo Framework 请求获取 ExtensionLoader,ExtensionLoader 是 Dubbo SPI 扩展机制的核心类;
  2. Dubbo Framework 加载 ExtensionLoader,并返回给用户;
  3. 用户调用 ExtensionLoader 的方法;
  4. ExtensionLoader 根据指定的 Extension 接口,通过 SPI 机制加载 Extension 实现;
  5. Extension 实现将被加载,ExtensionLoader 返回 Extension 实现给用户;

2、SPI扩展机制的使用示例

首先,我们需要定义一个SPI扩展接口,让Dubbo的扩展实现类都实现该接口。

示例代码:

package com.example.extension;

import com.alibaba.dubbo.common.extension.SPI;

@SPI("default")
public interface PrintService {
    void print(String msg);
}

 

在接口上添加@SPI注解,指定该扩展的默认实现类。

然后,我们需要在META-INF/services目录下创建一个“接口全限定类名”的文件名的文件,文件中写入我们实现的SPI扩展类的全限定类名。

比如我们需要同过实现PrintService接口来实现打印功能,那么我们在META-INF/services/目录下创建一个名为“com.example.extension.PrintService”的文件,文件内容为:

 

com.example.extension.impl.ConsolePrintServiceImpl

 

接下来,我们就可以通过Dubbo框架自动加载通过SPI机制注册的实现类了。

示例代码:

AnnotationConfigApplicationContext context = 
new AnnotationConfigApplicationContext(MAIn.class);
    PrintService printService = 
    ExtensionLoader.getExtensionLoader(PrintService.class).getDefaultExtension();
    printService.print("hello world!");

 

以上代码中,我们使用Dubbo的扩展加载器ExtensionLoader来获取PrintService接口的默认实现类,然后调用该实现类的print()方法即可实现打印功能。

3、Dubbo的SPI扩展机制中自定义扩展点的实现示例

在Dubbo框架中,我们可以通过自定义扩展点来增强Dubbo的功能。

自定义扩展点需要实现Dubbo提供的ExtensionFactory接口,并在META-INF/dubbo/internal/​路径下创建一个文件名为com.alibaba.dubbo.common.extension.ExtensionFactory的文件,文件中写入扩展点实现类的全限定类名。

示例代码:

 

package com.example.extension;

import com.alibaba.dubbo.common.extension.ExtensionFactory;

public class MyExtensionFactory implements ExtensionFactory {
    @Override
    public <T> T getExtension(Class<T> type, String name) {
        if (type.equals(PrintService.class)) {
            return (T) new ConsolePrintServiceImpl();
        }
        return null;
    }
}

 

在MyExtensionFactory中实现getExtension()方法,并根据type参数判断获取哪个扩展实现类。

在本示例中,我们仅仅实现了PrintService接口的实现类,因此只需要判断type参数是否为PrintService类即可。

下一步,我们需要在META-INF/dubbo/internal/目录下创建一个名为com.alibaba.dubbo.common.extension.ExtensionFactory的文件,文件内容为我们实现的扩展点实现类全限定类名。

比如我们实现的扩展点实现类为com.example.extension.MyExtensionFactory​,那么我们就要在META-INF/dubbo/internal/目录下创建一个名为com.alibaba.dubbo.common.extension.ExtensionFactory​的文件,并将文件内容写为com.example.extension.MyExtensionFactory。

最后,我们在程序中就可以使用自定义的扩展点了。示例代码:

AnnotationConfigApplicationContext context = 
new AnnotationConfigApplicationContext(Main.class);
PrintService printService = 
ExtensionLoader.getExtensionLoader(PrintService.class).getExtension("console");
printService.print("hello world!");
 

在以上示例代码中,我们通过getExtension()方法来获取PrintService接口的实现类。getExtension()方法中的参数为扩展点的name属性,该属性值默认为“default”。

在本示例中我们将name的值设置为“console”,因此即使用了我们自定义的扩展点实现类。

四、Dubbo的自定义扩展点机制

1、什么是自定义扩展点机制

Dubbo的自定义扩展点机制是在SPI扩展机制的基础上,增加了自定义扩展点的实现方式。通过Dubbo的扩展机制,我们可以通过配置文件切换Dubbo内部的实现方式,但是对于用户自己实现的功能模块,如何进行扩展呢?

这里就需要用到自定义扩展点机制了。

下图是自定义扩展点机制的详细时序图:

图片

自定义扩展点机制

在上图中:

  1. 用户首先将自己实现的扩展点注册到Dubbo中;
  2. 然后在需要使用该扩展点的时候,Dubbo会根据扩展点的名称进行查找并返回相应的扩展点实例;
  3. 通过这样的机制,用户可以灵活地扩展Dubbo的功能,同时也可以让Dubbo更加适应不同的业务场景。

自定义扩展点的核心思想就是:“面向接口编程,实现类实现接口,接口与实现类通过扩展点Binder关联。”

其中,Binder的定义可以参考以下的代码:

public interface ExtensionFactory {
    // 返回一个扩展点的代理对象
    <T> T getExtension(Class<T> type, String name) throws IllegalStateException;
}

public interface ExtensionLoader<T> {
    T getExtension(String name);
}

public interface ExtensionBinder<T> {
    // 绑定
    void bind(T instance);
    // 获取绑定的扩展对象
    T get();
}

public interface ExtensionLoaderListener {
    void onLoad();
}

2、自定义扩展点机制的使用示例

为了更好地理解Dubbo的自定义扩展点机制,我们可以通过一个简单的示例来演示其使用方法。假设我们有一个接口HelloService,我们想要通过自定义扩展点机制,为这个接口添加一个实现类。

首先,我们需要创建一个实现类HelloServiceImpl,该实现类需要实现HelloService接口。

接着,我们需要在resources/META-INF/dubbo目录下创建一个名为com.xxx.HelloService的文件,该文件中需要指定HelloService接口的实现类名称。

helloService=com.xxx.HelloServiceImpl

 

接下来,我们需要在代码中获取HelloService接口的实例。这可以通过以下方式实现:

ExtensionLoader<HelloService> loader = 
ExtensionLoader.getExtensionLoader(HelloService.class);
HelloService helloService = 
loader.getExtension("helloService");
helloService.sayHello();

 

其中,getExtensionLoader()方法用于获取扩展点的ExtensionLoader实例,getExtension()方法用于 获取具体的扩展实例。

在上面的代码中,我们通过“helloService”这个名称获取到了实现了HelloService接口的HelloServiceImpl实例,并调用了其中的sayHello()方法。

通过上述示例,我们可以看出,使用Dubbo的自定义扩展点机制非常简单,只需要在配置文件中指定实现类的名称,然后通过getExtensionLoader()和getExtension()方法获取实例即可。

3、Dubbo的自定义扩展点机制的实现示例

在Dubbo的自定义扩展点机制中,最核心的是ExtensionLoader类和ExtensionFactory类

其中,ExtensionLoader用于加载和管理扩展实例,ExtensionFactory用于创建扩展实例

下面,我们将通过一个简单的示例,演示Dubbo的自定义扩展点机制的具体实现方式。

首先,我们需要定义一个扩展点接口:

public interface HelloService {
    String sayHello(String name);
}

 

接着,我们需要实现该接口的一个实现类:

@SPI("helloWorld")
public class HelloWorldService implements HelloService {
    @Override
    public String sayHello(String name) {
        return "Hello, " + name;
    }
}
 

在这里,我们使用了@SPI注解来指定该扩展点的默认实现,如果配置文件中没有指定其他实现,则会使用该默认实现

接下来,我们需要创建一个名为com.xxx.HelloService的文件,该文件中需要指定扩展点接口的实现类名称:

helloWorld=com.xxx.HelloWorldService

 

最后,我们需要在代码中获取HelloService接口的实例,这可以通过以下代码实现:

ExtensionLoader<HelloService> loader = 
ExtensionLoader.getExtensionLoader(HelloService.class);
HelloService helloService = 
loader.getExtension("helloWorld");
System.out.println(helloService.sayHello("Dubbo"));

 

在上述代码中,我们通过getExtensionLoader()方法获取HelloService接口的ExtensionLoader实例,然后通过getExtension()方法获取名为“helloWorld”的实现类实例,并调用其中的sayHello()方法。

五、Dubbo的过滤器扩展机制

1、Dubbo的过滤器机制概述

图片

Dubbo的过滤器机制允许在调用前、调用后以及抛出异常时执行一些额外的操作。过滤器在调用链路中按顺序执行,可以在过滤器中实现各种功能,例如:日志记录、性能统计、权限控制等。

图片

内置过滤器

Dubbo中内置了多个过滤器,包括:ClassLoader过滤器、Context过滤器、Generic过滤器、Echo过滤器、Token过滤器、AccessLog过滤器等

下面是Dubbo的过滤器机制的时序图:

图片

上图中:

  1. 服务消费者向服务提供者发送请求时,请求先经过过滤器1;
  2. 如果过滤器1通过则进一步经过过滤器2;
  3. 如果过滤器2通过则进一步经过过滤器3;
  4. 如果过滤器3通过则将请求发送给服务提供者,服务提供者处理请求后将响应返回给服务消费者,响应也会经过相同的过滤器链路;
  5. 如果任意一个过滤器拒绝请求,则直接返回错误响应。

2、过滤器扩展机制的使用示例

Dubbo提供了扩展机制,可以在dubbo配置文件中配置过滤器,示例如下:

<dubbo:provider filter="accessLogFilter" />

在上面的例子中,accessLogFilter表示需要使用的过滤器名称,可以在dubbo配置文件中通过dubbo:filter标签进行定义。

3、自定义过滤器的实现示例

要实现自定义过滤器,需要按照以下步骤进行:

  1. 定义一个类实现org.Apache.dubbo.rpc.Filter接口;
  2. 实现接口中的方法;
  3. 在META-INF/dubbo目录下创建一个以org.apache.dubbo.rpc.Filter接口全限定名为名称的文件,并在文件中添加自定义过滤器的类名。

下面是一个自定义的过滤器示例:

package com.example;

import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.*;

@Activate(group = "provider")
public class MyFilter implements Filter {
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        // 在这里实现自己的逻辑
        return invoker.invoke(invocation);
    }
}

在上面的例子中,我们实现了一个MyFilter过滤器,并使用@Activate注解指定了它是一个provider端的过滤器,然后在invoke()方法中编写自己的逻辑,最后调用invoker.invoke(invocation)方法来执行调用链路中的下一个过滤器或服务。

六、Dubbo的负载均衡扩展机制

1、Dubbo的负载均衡扩展机制概述

负载均衡是分布式系统中的一个重要问题,它可以实现将请求分摊到多个服务提供者上,提高系统的并发能力和可用性。

Dubbo的负载均衡扩展机制允许用户自定义负载均衡策略,实现更加灵活、适合特定场景的负载均衡算法。

Dubbo内置了多种负载均衡算法,包括随机、轮询、最少活跃调用等。

下面是Dubbo的负载均衡扩展机制的时序图:

图片

负载均衡扩展机制

2、负载均衡扩展机制的使用示例

Dubbo的负载均衡扩展机制可以通过在服务提供方和服务消费方的配置文件中指定负载均衡策略来使用。

例如,在服务提供方的配置文件中可以添加以下配置:

<dubbo:service interface="com.xxx.XxxService" loadbalance="roundrobin" />

在服务消费方的配置文件中可以添加以下配置:

<dubbo:reference interface="com.xxx.XxxService" loadbalance="random" />

 

这样就可以实现使用Dubbo内置的轮询

3、自定义负载均衡策略的实现示例

用户可以通过实现Dubbo的LoadBalance接口来自定义负载均衡策略。

以下是一个示例:

public class MyLoadBalance implements LoadBalance {
    @Override
    public <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException {
        // 自定义负载均衡算法实现
        return invokers.get(0);
    }
}

 

七、Dubbo的容错机制扩展

1、Dubbo的容错机制概述

Dubbo的容错机制是指当Dubbo服务调用出现异常时,Dubbo框架会根据预设的容错机制进行处理,以保证服务的高可用性。

Dubbo框架默认提供了多种容错机制,如Failover、Failfast、Failsafe、Failback、Forking等,也支持自定义容错机制。

Dubbo的容错机制通常是通过在客户端代理层实现的,当远程服务调用出现异常时,客户端代理会根据预设的容错机制进行重试或处理,以保证服务的高可用性。

图片

容错机制

在Dubbo的容错机制中,ClusterInvoker负责调用远程服务,并进行容错处理。当调用远程服务发生异常时,Dubbo会按照以下顺序进行容错处理:

  1. ClusterInvoker处理异常;
  2. 如果ClusterInvoker处理异常失败,则交由Router处理异常;
  3. 如果Router处理异常失败,则交由LoadBalance处理异常;
  4. 如果LoadBalance处理异常失败,则抛出异常给InvokerInvocationHandler,最终抛出给Consumer。同时,Dubbo还会将异常信息进行监控,并更新调用统计信息。

2、容错机制扩展的使用示例

Dubbo默认的容错机制是Failover,即自动切换重试其他节点,达到容错和负载均衡的效果。如果需要使用其他容错机制,可以通过在服务提供方和服务消费方的配置文件中进行配置。

例如,我们可以通过以下方式配置使用Failfast容错机制:

在服务提供方的配置文件中增加如下配置:

<dubbo:service interface="com.example.service.SomeService" retries="0"/>

在服务消费方的配置文件中增加如下配置:

<dubbo:reference interface="com.example.service.SomeService" check="false" cluster="failfast"/>

 

这样,在服务调用出现异常时,Dubbo框架会自动使用Failfast容错机制进行处理,即只进行一次调用,若调用失败则立即抛出异常,不进行重试。

3、自定义容错策略的实现示例

如果需要实现自定义的容错策略,可以通过继承org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker​类,并实现org.apache.dubbo.rpc.Invoker接口,来自定义容错策略的实现。

例如,我们可以通过以下代码实现一个自定义的容错策略:

public class MyClusterInvoker<T> extends AbstractClusterInvoker<T> {
    public MyClusterInvoker(Directory<T> directory) {
        super(directory);
    }

    @Override
    protected Result doInvoke(Invocation invocation, List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException {
        // 自定义容错逻辑
        ...
    }
}
 

在实现自定义容错策略后,需要在服务提供方和服务消费方的配置文件中进行配置。

例如,在服务提供方的配置文件中增加如下配置:

 

<dubbo:service interface="com.example.service.SomeService" cluster="myClusterInvoker"/>

 

在服务消费方的配置文件中增加如下配置:

<dubbo:reference interface="com.example.service.SomeService" check="false" cluster="myClusterInvoker"/>

 

这样,在服务调用时,Dubbo框架会使用我们自定义的MyClusterInvoker容错策略进行处理。

八、Dubbo的扩展机制实践

1、实现一个使用自定义扩展点、过滤器、负载均衡器和容错机制的 Dubbo 服务

在这个实践中,我们将实现一个使用自定义扩展点、过滤器、负载均衡器和容错机制的 Dubbo 服务。

2、首先,我们需要定义一个服务接口。

例如,我们可以定义一个名为 SomeService 的服务接口,如下所示:

public interface SomeService {
    String sayHello(String name);
}

 

3、然后,我们需要实现该服务接口。

例如,我们可以实现一个名为 SomeServiceImpl 的服务实现类,如下所示:

public class SomeServiceImpl implements SomeService {
    @Override
    public String sayHello(String name) {
        return "Hello, " + name + "!";
    }
}
 

4、接下来,我们需要配置 Dubbo 的扩展点、过滤器、负载均衡器和容错机制。

例如,我们可以在服务提供方和服务消费方的配置文件中进行如下配置:

<!-- 扩展点配置 -->
<dubbo:protocol name="dubbo" extensinotallow="com.example.extension.MyProtocol"/>

<!-- 过滤器配置 -->
<dubbo:provider filter="com.example.filter.MyProviderFilter"/>
<dubbo:consumer filter="com.example.filter.MyConsumerFilter"/>

<!-- 负载均衡器配置 -->
<dubbo:reference interface="com.example.service.SomeService" loadbalance="com.example.loadbalance.MyLoadBalance"/>

<!-- 容错机制配置 -->
<dubbo:service interface="com.example.service.SomeService" cluster="com.example.cluster.MyCluster"/>
<dubbo:reference interface="com.example.service.SomeService" cluster="com.example.cluster.MyCluster"/>

其中,com.example.extension.MyProtocol​ 是一个自定义的 Dubbo 协议扩展点实现类,com.example.filter.MyProviderFilter​ 和 com.example.filter.MyConsumerFilter​ 是自定义的 Dubbo 过滤器实现类,com.example.loadbalance.MyLoadBalance​ 是一个自定义的 Dubbo 负载均衡器实现类,com.example.cluster.MyCluster 是一个自定义的 Dubbo 容错机制实现类。

5、最后,我们可以使用 Dubbo 的 API 在客户端调用该服务。

例如,我们可以使用如下代码在客户端调用该服务:

 

// 获取 Dubbo 服务引用
SomeService someService = DubboReferenceBuilder.newBuilder()
        .setInterface(SomeService.class)
        .setUrl("dubbo://localhost:20880")
        .build();

// 调用 Dubbo 服务
String result = someService.sayHello("Dubbo");
System.out.println(result);
  •  

这样,我们就实现了一个使用自定义扩展点、过滤器、负载均衡器和容错机制的 Dubbo 服务

本文转载自微信公众号「哪吒编程」



Tags:Dubbo   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
图解Dubbo,Dubbo 服务治理详解
当前,分布式服务在互联网行业中得到了广泛应用。然而,分布式服务不仅仅是将单个应用程序分割成不同的模块,还涉及到模块之间的相互合作和协作。服务治理是分布式服务的一个关键...【详细内容】
2023-10-17  Search: Dubbo  点击:(218)  评论:(0)  加入收藏
深入理解java和dubbo的SPI机制
作者 | 京东云开发者-京东物流 龚航林原文链接:https://my.oschina.net/u/4090830/blog/101160111 SPI 简介1.1 SPI(Service Provider Interface)本质:将接口实现类的全限定名...【详细内容】
2023-10-11  Search: Dubbo  点击:(243)  评论:(0)  加入收藏
实例讲解SpringBoot集成Dubbo的步骤及过程
首先,让我们先了解一下Spring Boot和Dubbo。Spring Boot 是一个开源的 Java Web 框架,它可以帮助开发者快速创建独立的、生产级别的 Spring 应用程序。Spring Boot 提供了很多...【详细内容】
2023-09-26  Search: Dubbo  点击:(251)  评论:(0)  加入收藏
Dubbo + Nacos这么玩就失去高可用的能力了
我们常用的微服务框架是SpringCloud那一套,在服务远程调用和注册中心的选型上也有不少方案。在服务远程调用上常用的有:Feign、Dubbo等,在注册中心上常用的有:Nacos、Zookeeper...【详细内容】
2023-09-08  Search: Dubbo  点击:(266)  评论:(0)  加入收藏
如何将 Dubbo Filter 拦截器原理运用到日志拦截器中?
业务背景我们希望可以在使用日志拦截器时,定义属于自己的拦截器方法。实现的方式有很多种,我们分别来看一下。拓展阅读java 注解结合 spring aop 实现自动输出日志[1]java 注...【详细内容】
2023-08-06  Search: Dubbo  点击:(227)  评论:(0)  加入收藏
基于Dubbo解决亿级流量中缓存双写策略问题
1.引言在处理大规模流量和高并发读写请求的分布式系统中,缓存双写是一项关键任务。保证缓存的一致性和高可用性是挑战性的,特别是在面对亿级流量的场景下。本文将探讨亿级流量...【详细内容】
2023-05-16  Search: Dubbo  点击:(348)  评论:(0)  加入收藏
图解Dubbo,六种扩展机制详解
今天详细的分解一下Dubbo的扩展机制,实现快速入门,丰富个人简历,提高面试level,给自己增加一点谈资,秒变面试小达人,BAT不是梦。说真的,从零学习Dubbo,看这个系列足够了,共10篇,欢迎持...【详细内容】
2023-04-12  Search: Dubbo  点击:(158)  评论:(0)  加入收藏
Go 语言体系下的微服务框架选型: Dubbo-go
作 者 | 牛学蔚(蔚俊)本文介绍了Go 微服务体系发展与选型,过去一年Dubbo-go 社区的飞速发展以及对未来的展望。一、Go 微服务体系发展与选型随着微服务技术的快速发展,其在各...【详细内容】
2023-04-11  Search: Dubbo  点击:(275)  评论:(0)  加入收藏
如何用一个端口同时暴露 HTTP1/2、gRPC、Dubbo 协议?
本文我们将介绍 Apache Dubbo 灵活的多协议设计原则,基于这一设计,在 Dubbo 框架底层可灵活的选用 HTTP/2、HTTP/REST、TCP、gRPC、JsonRPC、Hessian2 等任一 RPC 通信协议,同...【详细内容】
2023-03-17  Search: Dubbo  点击:(84)  评论:(0)  加入收藏
阿里一面:说一说Java、Spring、Dubbo三者SPI机制的原理和区别
大家好,我是三友~~今天来跟大家聊一聊Java、Spring、Dubbo三者SPI机制的原理和区别。其实我之前写过一篇类似的文章,但是这篇文章主要是剖析dubbo的SPI机制的源码,中间只是简单...【详细内容】
2023-03-14  Search: Dubbo  点击:(142)  评论:(0)  加入收藏
▌简易百科推荐
Netflix 是如何管理 2.38 亿会员的
作者 | Surabhi Diwan译者 | 明知山策划 | TinaNetflix 高级软件工程师 Surabhi Diwan 在 2023 年旧金山 QCon 大会上发表了题为管理 Netflix 的 2.38 亿会员 的演讲。她在...【详细内容】
2024-04-08    InfoQ  Tags:Netflix   点击:(0)  评论:(0)  加入收藏
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(6)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(13)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(9)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(11)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(9)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
站内最新
站内热门
站内头条