曲木为直终必弯,养狼当犬看家难。墨染鸬鹚黑不久,粉刷乌鸦白不坚。
蜜饯黄莲终需苦,强摘瓜果不能甜。好事总得善人做,哪有凡人做神仙
Spring Boot 将常见的开发功能,分成了一个个的starter,这样我们开发功能的时候只需要引入对应的starter,而不需要去引入一堆依赖了!starter可以理解为一个依赖组,其主要功能就是完成引入依赖和初始化配置。Spring 官方提供的starter 命名规范为 spring-boot-starter-xxx ,第三方提供的starter命名规范为 xxx-spring-boot-starter 。
一、新建项目
新建一个名为 rsocket-spring-boot-starter 的项目,并且引入下面的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
二、新增配置类
配置类对应的properties文件中的属性为tcp.ip;
@ConfigurationProperties(prefix = "tcp")
public class RsocketPorperties {
private String ip;
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
}
三、新增节点获取Id的方法
该方法主要就是像读取的ip节点发送内容
@Slf4j
public class Node {
private String ip;
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String send(String data){
RSocketStrategies strategies = RSocketStrategies.builder()
.encoders(encoders -> encoders.add(new Jackson2CborEncoder()))
.decoders(decoders -> decoders.add(new Jackson2CborDecoder()))
.build();
//创建Rsocket
RSocketRequester requester = RSocketRequester.builder()
.rsocketStrategies(strategies)
.tcp(getIp(), 7000);
//发送消息到服务器端
Message message = requester
.route("contract-request")
.data(new Message("Client", "Request", data))
.retrieveMono(Message.class)
.block();
log.info("客户端收到响应 {}", message);
return "success --- "+ getIp();
}
}
四、新增自动配置类
使用注解 @EnableConfigurationProperties 启用 JavatipProperties 配置类
使用注解 @Configuration 配合 @Bean 注册一个拼接字符串的bean对象。
@Configuration
@EnableConfigurationProperties(RsocketPorperties.class)
public class RsocketAutoConfiguration {
@Autowired
private RsocketPorperties rsocketPorperties;
@Bean
public Node getNode(){
Node node = new Node();
node.setIp(rsocketPorperties.getIp());
return node;
}
}
五、新增配置发现文件
在resources文件夹中新建 META-INF 文件夹,在 META-INF 文件夹中新建配置发现文件 spring.factories,并且将自动配置类写到文件里。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.opendatachain.config.RsocketAutoConfiguration
六、编写pom文件
作者就是编写.pom文件是打包方式不对就错了,找了好久才发现问题
注意:如下这是错误方式,这种打包是会把springboot的内置服务器 tomcat/netty 打包到jar包中,这种方式在如下测试类中导包没问题,但是类引入不了。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
正确打包方式如下:
<properties>
<java.version>11</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
六、打包测试
使用 mvn clean install 命令将项目打包推送到本地maven仓库,然后新建一个测试项目,引入打包好的依赖。
<dependency>
<groupId>cn.opendatachain</groupId>
<artifactId>odc-rsocket-starter</artifactId>
<version>0.1.0</version>
</dependency>
在 application.yml 文件中写入自动拼接的字符串对应的属性 tcp.ip 。
tcp:
ip: 10.0.90.92
然后手写一个测试类:
@RestController
public class TestController {
@Autowired
private Node strUt;
@GetMapping("test")
public String test(){
MessageData messageData = new MessageData();
messageData.setContractName("contract");
messageData.setChannelName("channel");
messageData.setDbName("dbname");
messageData.setKey("lishijian");
messageData.setValue("SSSSSSSSSSSSSS");
String str = this.strUt.send(JSON.toJSONString(messageData));
return str;
}
}
这样,一个简单的starter就写好了,只要理解了starter的原理,实现起来就很简单,第一点就是starter相当于一个依赖组,另一点就是starter可以完成初始化配置。
end。
网友评论