Dubbo——Dubbo协议整合Jackson序列化解决方案
生活随笔
收集整理的這篇文章主要介紹了
Dubbo——Dubbo协议整合Jackson序列化解决方案
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
環境配置
spring boot 2.6.3
spring cloud 2021.0.1
spring cloud alibaba 2021.0.1.0
nacos server 2.0.4
dubbo 2.7.15
官方文檔
序列化擴展:SPI擴展實現-序列化擴展
多協議配置:配置多協議
已知擴展
解決方案
源代碼:https://gitee.com/myzstu/auth/tree/master/auth-core/src/main/java/club/zstuca/myzstu/dubbo/serialize/jackson
Maven 項目結構:
src|-main|-java|-com|-xxx|-XxxSerialization.java (實現Serialization接口)|-XxxObjectInput.java (實現ObjectInput接口)|-XxxObjectOutput.java (實現ObjectOutput接口)|-resources|-META-INF|-dubbo|-org.apache.dubbo.common.serialize.Serialization (純文本文件,內容為:xxx=com.xxx.XxxSerialization)JacksonSerialization.java:
package club.zstuca.myzstu.dubbo.serialize.jackson;import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.serialize.ObjectInput; import org.apache.dubbo.common.serialize.ObjectOutput; import org.apache.dubbo.common.serialize.Serialization;import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;/*** Jackson serialization implementation** <pre>* e.g. <dubbo:protocol serialization="jackson" />* </pre>** @author shentuzhigang* @date 2022/3/19 15:00*/ public class JacksonSerialization implements Serialization {private final byte JACKSON_SERIALIZATION_ID = 31;private static ObjectMapper objectMapper = new ObjectMapper();public static synchronized void setObjectMapper(ObjectMapper objectMapper) {JacksonSerialization.objectMapper = objectMapper;}@Overridepublic byte getContentTypeId() {return JACKSON_SERIALIZATION_ID;}@Overridepublic String getContentType() {return "text/json";}@Overridepublic ObjectOutput serialize(URL url, OutputStream output) throws IOException {return new JacksonObjectOutput(objectMapper, output);}@Overridepublic ObjectInput deserialize(URL url, InputStream input) throws IOException {return new JacksonObjectInput(objectMapper, input);} }JacksonObjectInput.java:
package club.zstuca.myzstu.dubbo.serialize.jackson;import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.type.TypeFactory; import org.apache.dubbo.common.serialize.ObjectInput;import java.io.*; import java.lang.reflect.Type;/*** Jackson object input implementation** @author shentuzhigang* @date 2022/3/19 15:07*/ public class JacksonObjectInput implements ObjectInput {private final ObjectMapper objectMapper;private final BufferedReader reader;public JacksonObjectInput(InputStream input) {this(new ObjectMapper(), input);}public JacksonObjectInput(ObjectMapper objectMapper, InputStream input) {this(objectMapper, new InputStreamReader(input));}public JacksonObjectInput(ObjectMapper objectMapper, Reader reader) {this.objectMapper = objectMapper;this.reader = new BufferedReader(reader);}@Overridepublic boolean readBool() throws IOException {return read(boolean.class);}@Overridepublic byte readByte() throws IOException {return read(byte.class);}@Overridepublic short readShort() throws IOException {return read(short.class);}@Overridepublic int readInt() throws IOException {return read(int.class);}@Overridepublic long readLong() throws IOException {return read(long.class);}@Overridepublic float readFloat() throws IOException {return read(float.class);}@Overridepublic double readDouble() throws IOException {return read(double.class);}@Overridepublic String readUTF() throws IOException {return read(String.class);}@Overridepublic byte[] readBytes() throws IOException {return readLine().getBytes();}@Overridepublic Object readObject() throws IOException, ClassNotFoundException {return objectMapper.readTree(readLine());}@Overridepublic <T> T readObject(Class<T> cls) throws IOException, ClassNotFoundException {return read(cls);}@Overridepublic <T> T readObject(Class<T> cls, Type type) throws IOException, ClassNotFoundException {JavaType javaType = TypeFactory.defaultInstance().constructType(type);return objectMapper.readValue(readLine(), javaType);}private String readLine() throws IOException, EOFException {String line = reader.readLine();if (line == null || line.trim().length() == 0) {throw new EOFException();}return line;}private <T> T read(Class<T> cls) throws IOException {String json = readLine();return objectMapper.readValue(json, cls);} }JacksonObjectOutput.java:
package club.zstuca.myzstu.dubbo.serialize.jackson;import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.dubbo.common.serialize.ObjectOutput;import java.io.*;/*** Jackson object output implementation** @author shentuzhigang* @date 2022/3/19 15:06*/ public class JacksonObjectOutput implements ObjectOutput {private final ObjectMapper objectMapper;private final PrintWriter writer;public JacksonObjectOutput(OutputStream output) {this(new ObjectMapper(), output);}public JacksonObjectOutput(ObjectMapper objectMapper, OutputStream out) {this(objectMapper, new OutputStreamWriter(out));}public JacksonObjectOutput(ObjectMapper objectMapper, Writer writer) {this.objectMapper = objectMapper;this.writer = new PrintWriter(writer);}@Overridepublic void writeBool(boolean v) throws IOException {writeObject(v);}@Overridepublic void writeByte(byte v) throws IOException {writeObject(v);}@Overridepublic void writeShort(short v) throws IOException {writeObject(v);}@Overridepublic void writeInt(int v) throws IOException {writeObject(v);}@Overridepublic void writeLong(long v) throws IOException {writeObject(v);}@Overridepublic void writeFloat(float v) throws IOException {writeObject(v);}@Overridepublic void writeDouble(double v) throws IOException {writeObject(v);}@Overridepublic void writeUTF(String v) throws IOException {writeObject(v);}@Overridepublic void writeBytes(byte[] v) throws IOException {writer.println(new String(v));}@Overridepublic void writeBytes(byte[] v, int off, int len) throws IOException {writer.println(new String(v));}@Overridepublic void writeObject(Object obj) throws IOException {writer.write(objectMapper.writeValueAsString(obj));writer.println();writer.flush();}@Overridepublic void flushBuffer() throws IOException {writer.flush();} }META-INF/dubbo/org.apache.dubbo.common.serialize.Serialization:
jackson=club.zstuca.myzstu.dubbo.serialize.jackson.JacksonSerializationObjectMapper:
默認情況下,Jackson序列化和反序列化時所使用的ObjectMapper定義如下:
使用
provider
XML
<dubbo:protocol name="dubbo" port="20880" serialization="jackson" />配置文件
Properties
dubbo.protocols.id=jackson dubbo.protocols.name=dubbo dubbo.protocols.port=20880 dubbo.protocols.serialization=jacksonYAML
dubbo:config:multiple: trueprotocols:dubbo:id: dubboname: dubboport: -1jackson:id: jacksonname: dubboport: 20880serialization: jacksonconsumer
無需其他配置
常見問題
參考文章
- Dubbo Jackson序列化使用說明
總結
以上是生活随笔為你收集整理的Dubbo——Dubbo协议整合Jackson序列化解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Web安全——服务器端请求伪造(SSRF
- 下一篇: Spring Cloud——基于Dubb