Springboot 2.6.1 + Nacos 2.0.3 + Dubbo 3.0.2.1
- 一、写在前面,先记录问题
- 1.记录一个奇怪的问题:执行 docker ps 报错:bash: /bin/docker: Permission denied
- 2.启动容器:exec:"docker-proxy":executable file not found in $PATH
- 3.以上问题最终导致服务器/etc目录文件权限异常(可能为我误操作),服务器重装。。。。。。
- 4.终于安好了:http://106.12.148.211:8848/nacos/
- 5.好个锤子,代码启动一直报错。。。***module java.base does not "opens java.lang" to unnamed module***
- 6.你以为就这样结束了吗?程序启动后,服务注册一直失败:***ErrCode:-401, ErrMsg:Client not connected,current status:STARTING***
- 7.把Docker启动容器命令说一下,是取Centos官方镜像和Nacos官方编译包搭建的:
- 二、版本和环境、演示
- 三、一起看代码(如何建项目不在细说):
- 四、终于结束了 想学习还是踩着巨人的肩膀比较好,自己看太费劲了;毕竟我们不是搞科研,单纯想提升能力而已*
一、写在前面,先记录问题
1.记录一个奇怪的问题:执行 docker ps 报错:bash: /bin/docker: Permission denied
此问题为 /usr/bin/docker 文件丢失执行权限导致的,增加可执行权限即可
先允许编辑:chattr -ia /usr/bin/docker
在增加权限:chmod 777 /usr/bin/docker
最后去除可修改设置:chattr +ia /usr/bin/docker
2.启动容器:exec:“docker-proxy”:executable file not found in $PATH
若果不存在/usr/bin/docker-proxy ,则创建: ln -s /usr/libexec/docker/docker-proxy-current /usr/bin/docker-proxy
增加权限:chattr -ia /usr/bin/docker-proxy && chmod 777 /usr/bin/docker-proxy && chattr +ia /usr/bin/docker-proxy
3.以上问题最终导致服务器/etc目录文件权限异常(可能为我误操作),服务器重装。。。。。。
4.终于安好了:http://106.12.148.211:8848/nacos/
5.好个锤子,代码启动一直报错。。。module java.base does not “opens java.lang” to unnamed module
首先启动报错,大概就是JDK9 及以上版本中 引入的Java Platform Module System 模块化导致的(可能我取得版本配套本身有问题,暂不做具体分析):
throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @2898ac89
解决方案:在IDEA中修改VM启动参数:--add-opens java.base/java.lang=ALL-UNNAMED
下面消费者启动需要多一个依赖:--add-opens java.base/java.math=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED
6.你以为就这样结束了吗?程序启动后,服务注册一直失败:ErrCode:-401, ErrMsg:Client not connected,current status:STARTING
查询资料后发现如下解释:Nacos升级2.0.0版本后,增加了9848,9849端口来进行GRPC通信(官网说明如下):
7.把Docker启动容器命令说一下,是取Centos官方镜像和Nacos官方编译包搭建的:
错误示范如下:docker run -itd --privileged=true --name nacos -p 8848:8848 docker.io/centos:centos7.9.2009 /bin/bash
顺便说一下,如果Docker容器已启动,怎么加端口:
将已有的容器停止,并提交为镜像:docker stop nacos && docker commit nacos nacos:2.0.3
把原来容器删掉,通过新的镜像标签启动容器,并增加需要的端口映射:
docker run -itd --privileged=true --name nacos -p 8848:8848 -p 9848:9848 -p 9849:9849 nacos:2.0.3 /bin/bash
将 Nacos官网 编译好的文件解压拷贝到容器内:/usr/local 目录下;在写一个简单的服务脚本:
#/bin/bash
NACOS=/usr/local/nacos/bin
comm=$1
case $comm in
"start")
sh ${NACOS}/startup.sh -m standalone
;;
"stop")
sh ${NACOS}/shutdown.sh
;;
*)
echo "Input Error"
;;
esac
二、版本和环境、演示
感觉版本有点混乱,但是流程打通了:
Jdk | 17 |
---|---|
Springboot | 2.6.1 |
Dubbo | 3.0.2.1 |
Nacos | 2.0.3 |
上菜,项目结构图:
启动提供者,启动消费者,看下服务注册情况:
提供者详情:
消费者详情:
## 调用演示:http://192.168.31.2:8090/test/hello/?name=hongxu_moon
三、一起看代码(如何建项目不在细说):
1.父项目Pom配置:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.demo</groupId>
<artifactId>nacos</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>service</module>
<module>provider</module>
<module>consumer</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.1</version>
<relativePath/>
</parent>
<properties>
<log4j.version>2.17.0</log4j.version>
<slf4j.version>1.7.25</slf4j.version>
<dubbo.version>3.0.2.1</dubbo.version>
<nacos.version>2.0.3</nacos.version>
<lombok.version>1.18.22</lombok.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<!--Log4j2-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!-- dubbo 依赖-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>${dubbo.version}</version>
</dependency>
<!--nacos-->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos.version}</version>
<exclusions>
<exclusion>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>nacos</finalName>
</build>
</project>
2.接口层(消费者和提供者的公共依赖层)
Pom配置:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>nacos</artifactId>
<groupId>com.demo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>service</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</dependency>
</dependencies>
</project>
接口:
package com.demo.service;
/**
* 测试接口
* @author Administrator
*/
public interface TestService {
/**
* 你好
* @param name
* @return
*/
String hello(String name);
}
3.提供者:
Pom配置:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>nacos</artifactId>
<groupId>com.demo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>provider</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.demo</groupId>
<artifactId>service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
启动类:
package com.demo;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Description: 提供者
*
* @Author: zhx & moon hongxu_1234@163.com
* @Date: 2021-12-22 0:03
* @version: V1.0.0
*/
@SpringBootApplication
@EnableDubbo
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class,args);
}
}
实现类:
package com.demo.serviceImpl;
import com.demo.service.TestService;
import org.apache.dubbo.config.annotation.DubboService;
/**
* Description: 提供者
*
* @Author: zhx & moon hongxu_1234@163.com
* @Date: 2021-12-21 23:12
* @version: V1.0.0
*/
@DubboService(version = "1.0.0",interfaceClass = TestService.class)
public class TestServiceImpl implements TestService {
@Override
public String hello(String name) {
return "Hello " + name;
}
}
配置文件:
server:
port: 8089
spring:
application:
name: auto_provider
dubbo:
application:
name: providers
id: providers
registry:
address: nacos://106.12.148.211:8848
timeout: 100000
protocol:
name: dubbo
port: 20880
scan:
base-packages: com.demo.serviceImpl
4.消费者:
Pom配置:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>nacos</artifactId>
<groupId>com.demo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>consumer</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.demo</groupId>
<artifactId>service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
启动类:
package com.demo;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Description: 消费者
*
* @Author: zhx & moon hongxu_1234@163.com
* @Date: 2021-12-22 0:59
* @version: V1.0.0
*/
@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class,args);
}
}
接口类:
package com.demo.controller;
import com.demo.service.TestService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Description: 消费者
*
* @Author: zhx & moon hongxu_1234@163.com
* @Date: 2021-12-21 23:11
* @version: V1.0.0
*/
@RestController
@RequestMapping("/test")
public class TestController {
@DubboReference(version = "1.0.0",interfaceClass = TestService.class)
TestService testService;
/**
* 你好
* @param name
* @return
*/
@GetMapping("/hello")
public String hello(String name){
return testService.hello(name);
}
}
配置文件:
server:
port: 8090
spring:
application:
name: auto_consumer
dubbo:
application:
name: consumer
id: consumer
registry:
address: nacos://106.12.148.211:8848
timeout: 100000
scan:
base-packages: com.demo.controller