<!-- If you need to report a security issue please visit https://github.com/apache/dubbo/security/policy -->

- [ x ] I have searched the [issues](https://github.com/apache/dubbo/issues) of this repository and believe that this is not a duplicate.

### Environment

* Dubbo version: 3.0.5
* Operating System version: k8s/spring boot
* Java version: jdk11

### Steps to reproduce this issue

1. 在配置文件`application.yml`中开启探针
  ```yaml
    dubbo:
      application:
        name: demo-provider
        qos-enable: true
        qos-accept-foreign-ip: true
  ```
2. 启动应用，此时consumer可以正常调用provider，可以正常返回结果。
3. 但是，访问以下三个地址
   ```bash
   curl -v http://localhost:22222/live      # 返回true
   curl -v http://localhost:22222/ready  # 报错
   curl -v http://localhost:22222/startup #报错
   ```
  访问http://localhost:22222/ready 异常信息如下：
  ```
  2022-01-27 12:20:58.515 ERROR 28796 --- [ qos-worker-3-4] o.a.d.q.s.handler.HttpProcessHandler     :  [DUBBO] execute commandContext: org.apache.dubbo.qos.command.CommandContext@1dcc6545 got exception, dubbo version: 3.0.5, current host: 10.33.0.2

java.lang.NullPointerException: null
	at org.apache.dubbo.qos.probe.impl.DeployerReadinessProbe.check(DeployerReadinessProbe.java:36) ~[dubbo-3.0.5.jar:3.0.5]
	at org.apache.dubbo.qos.command.impl.Ready.execute(Ready.java:57) ~[dubbo-3.0.5.jar:3.0.5]
	at org.apache.dubbo.qos.command.DefaultCommandExecutor.execute(DefaultCommandExecutor.java:39) ~[dubbo-3.0.5.jar:3.0.5]
	at org.apache.dubbo.qos.server.handler.HttpProcessHandler.channelRead0(HttpProcessHandler.java:87) ~[dubbo-3.0.5.jar:3.0.5]
	at org.apache.dubbo.qos.server.handler.HttpProcessHandler.channelRead0(HttpProcessHandler.java:50) ~[dubbo-3.0.5.jar:3.0.5]
	at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.handlerRemoved(ByteToMessageDecoder.java:253) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:515) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:447) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
  ```

  访问http://localhost:22222/startup 异常信息如下：
  ```
  2022-01-27 12:47:24.864 ERROR 28796 --- [qos-worker-3-10] o.a.d.q.s.handler.HttpProcessHandler     :  [DUBBO] execute commandContext: org.apache.dubbo.qos.command.CommandContext@40f5738f got exception, dubbo version: 3.0.5, current host: 10.33.0.2

java.lang.NullPointerException: null
	at org.apache.dubbo.qos.probe.impl.DeployerStartupProbe.check(DeployerStartupProbe.java:35) ~[dubbo-3.0.5.jar:3.0.5]
	at org.apache.dubbo.qos.command.impl.Startup.execute(Startup.java:58) ~[dubbo-3.0.5.jar:3.0.5]
	at org.apache.dubbo.qos.command.DefaultCommandExecutor.execute(DefaultCommandExecutor.java:39) ~[dubbo-3.0.5.jar:3.0.5]
	at org.apache.dubbo.qos.server.handler.HttpProcessHandler.channelRead0(HttpProcessHandler.java:87) ~[dubbo-3.0.5.jar:3.0.5]
	at org.apache.dubbo.qos.server.handler.HttpProcessHandler.channelRead0(HttpProcessHandler.java:50) ~[dubbo-3.0.5.jar:3.0.5]
	at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.handlerRemoved(ByteToMessageDecoder.java:253) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:515) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:447) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-all-4.1.56.Final.jar:4.1.56.Final]
	at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
  ```

ApplicationModel applicationModel = Mockito.mock(ApplicationModel.class);
        ModuleModel moduleModel = Mockito.mock(ModuleModel.class);
        moduleDeployer = Mockito.mock(ModuleDeployer.class);
        Mockito.when(frameworkModel.newApplication()).thenReturn(applicationModel);
        Mockito.when(applicationModel.getModuleModels()).thenReturn(Arrays.asList(moduleModel));
        Mockito.when(moduleModel.getDeployer()).thenReturn(moduleDeployer);
        Mockito.when(moduleDeployer.isStarted()).thenReturn(true);
        ExtensionLoader loader = Mockito.mock(ExtensionLoader.class);
        Mockito.when(frameworkModel.getExtensionLoader(ReadinessProbe.class)).thenReturn(loader);
        URL url = URL.valueOf("application://").addParameter(CommonConstants.QOS_READY_PROBE_EXTENSION, "");
        List<ReadinessProbe> readinessProbes = Arrays.asList(
            new DeployerReadinessProbe(frameworkModel.newApplication()),
            new ProviderReadinessProbe()
        );
        Mockito.when(loader.getActivateExtension(url, CommonConstants.QOS_READY_PROBE_EXTENSION)).thenReturn(readinessProbes);
    }
    @Test
    public void testExecute() {
        Ready ready = new Ready(frameworkModel);
        CommandContext commandContext = new CommandContext("ready");
        String result = ready.execute(commandContext, new String[0]);
        Assertions.assertEquals(result, "true");
        Assertions.assertEquals(commandContext.getHttpCode(), 200);
        Mockito.when(moduleDeployer.isStarted()).thenReturn(false);
        result = ready.execute(commandContext, new String[0]);
        Assertions.assertEquals(result, "false");
        Assertions.assertEquals(commandContext.getHttpCode(), 503);
    }
}