Rpc can be testedwith example projects.
I put all components in separate packages that it is easily recognizable what class belongs to what.
Everything internaly is connected with spring annotation which makes it ready to use with spring based applications as pluggable components.
For non spring applications threre is Refero class, with srtatic factory methodes that can be used to create server and client side endpoints.
For compiling from sources you have to install maven-protoc-plugin
and protocol buffers compiler and configure project.protoc.bin
to
protoc location it in pom.xml
of project.
Required files for starting server with default logging framework (logback) and encryption are:
-
refero.properties
example file for server:
server_worker_threads=30 #AES conf enable_symmetric_encryption=true #long plain text password cipher_key=nr2ih4$%#$sdfgfghdl@#$DRRDEWewekj+#$_@#$'gfkdfkghiwrFDDS #rsa conf enable_asymmetric_encryption=true #base64 encoded server keys prv=MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCZmjtK8sFVLRg7BIoNzj4xUxSIWZAuECcdK4BdRPn1hcpa/dt1QuYbUr72spxTxkvCkAv4i+Y1UD70N0slU6FXAZLEJUGlmlZDekLHdBQOb5FBRhxnOYoJL0WxHow6Dq7r6sE7mOCNTb6CxHraxIF4dsmLOU6XCRPIFDpT7sfDT+NHvNy9c3RvSkJdMRv6qdRCuVG+KLnWaIFS0NU5denmYLcXr+xSum2lOG9wVc5NyaVCuIZuYAv8gn2qaQw4lUI/SOE5CaMmvKKrKzeaKUKeg9BwlpN2eCnkfLrDg31k61w0lFzik4P0gZfhNlAHD7/kgaMSJez0MhUNZcjsWgQhAgMBAAECggEAJRU1J10AC949MVJhOgAGx8W0+U4WHujLaKFt9haG+h14wwryhpbGEuahL9HjJ96Bv9Ei8rhjtY9QA4mt3K8aDnVUx4HvHVnrZZMIuDpv9SQ+PzH7/XfIuXruKlqjpAiTdmVQjWDVJYgVbGCfAF3cnAahlbkaHiCU5ALuKgFFvQMWecjk/YjG5/AoulC8n07CPdg2X1bds28y1lFujQO2ehCT2EF/pukaJwhbr6zEDrCaL00p3Kq0Tag9N72Rb0UmGMLE1z2nJhpAv3K4AE1GOt+zC/A+3G+y7oWVRdc7XVWLVj6+Vti5AoPpNJeISty2zPPuHVfXvBv6MKnIzj5QGQKBgQDTuAGArohO4NmxkpAzw2MHnwJ9+DCmkS/2CFmsxeeLuCh54SB0pq2vC/VBVQ39xEcDUc4Z16NVubHl0l2XC8OYuZaOod/5xsbGBVaWgpP/gxxeT3nf/0qxXXg32naGAOe/JR5LJNAUgyYA4kbQPdx03m21Webtc+4gXYWv+j23wwKBgQC5uoWhI9Ottzp7MyCufCYO73YrHsb345OA8YkrIUrwGGyhpSUqlXuPcq5YRWfriMFdTpvFQgq3WvqdWG/BNSBGX2aTBOM1JEQP8XbscSrSTDRA6mcduYn3Rym6i+kPQ2FqEH7UVB+IwrpxB4gHqMJk+1rYLgE82zvs+ZeFxaE6SwKBgCNdUgrvnF8omdRaefHbijgkrGLkSSQZjlxXars8V3/0I/avzx8NFGfv5GikT3D7Dy2TxYx1g5f3K6sK540qbuKc5XQvv9zWAi/jhmIfr573hI6QUfhDiXN0/Ha/7BpYHl3EUnoUzRkQCxIMue1g1+lBmiu3t6YkPjtzw7fwYczHAoGBAIxSs2Gi+ux10jaA04FhBTQlkgdUMonZpHk4hCVU+xRZr8GVT3ZUCE3CHJ1Omwxmf4mquaAYnJYZo927knvMUr04mPwdJjjhVJcjHXHYsry+nIArWYsowmdUmd96k7RXeUM0gU6U3FpsnYaGZS08QNsg2WsZnw/GqAkMLoIAZibvAoGBAKMXfIR6/3Kv4vbkTl7zsVASSIiJ8MFhsIQjT8p7p8QOS8k7oWAx4Et3im7yUoOxu8sHWZshQO4y3sDe052bjwz1CJZVkq/A6SyzXzoX3opOmtQ0lEZtqd3cPkY13392gm13xRix7ouoCQguAENeeX4G+XH0PXbwo1R+hQb5CUZU #base64 encoded client keys pub=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzd/d64TV7Pcsymggl1L0cpT786kzgK8+/AVc7h4iLmt5DWdJNUQwxi85sUQfef6mCLQzIAnRXoJ9IN034h1mq2926Lso6WiOt0KrnqNcw+8iCxsyS3zDpG5ObNzAuHiEmT79Rs5/TVJXTB6aBli7lsHf87J7F1NwohtBLK9M62sHTWz0/kKCBMP/X9fCES+XXOcMUl4EcJaJyWPIbBYwkPRPVkqgK0cP9R3gy5UFgfQ6WknW47IJhjz/69YMT5RUwtuFm/r4AA1VWN5PIVXJogaqs0Iw7STe07UZqn7ruuwU63Ma7JZ2u3qbzD5Go9R0W9FtblW67KWlvKbNg98erwIDAQAB enable_traffic_logging=false
example file for client:
client_worker_threads=50 reconnect=true #in seconds reconnect_delay=10 blocking_method_call_timeout=15 #AES conf enable_symmetric_encryption=true #long plain text password cipher_key=nr2ih4$%#$sdfgfghdl@#$DRRDEWewekj+#$_@#$'gfkdfkghiwrFDDS #rsa conf enable_asymmetric_encryption=true #base64 encoded client key prv=MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDN393rhNXs9yzKaCCXUvRylPvzqTOArz78BVzuHiIua3kNZ0k1RDDGLzmxRB95/qYItDMgCdFegn0g3TfiHWarb3bouyjpaI63Qqueo1zD7yILGzJLfMOkbk5s3MC4eISZPv1Gzn9NUldMHpoGWLuWwd/zsnsXU3CiG0Esr0zrawdNbPT+QoIEw/9f18IRL5dc5wxSXgRwlonJY8hsFjCQ9E9WSqArRw/1HeDLlQWB9DpaSdbjsgmGPP/r1gxPlFTC24Wb+vgADVVY3k8hVcmiBqqzQjDtJN7TtRmqfuu67BTrcxrslna7epvMPkaj1HRb0W1uVbrspaW8ps2D3x6vAgMBAAECggEAQ3N1YhTDgj/5jNdQ1kN3k5L8eXiWRzMjj66yI9H7oPnVT27nrWwKDuSqIkoPhgjInVFs7rJIxo46MOpJxOudF84NR3MKlG6NU72kPPWJDyjqHnlqoRDfiKAbUc+B1O6ngw4ALZK6Yrr3nxjnney0iVA777wqWBoebP5A/ELzEK4JJCGzYAyALgykvLwl8hP3OTY+o5pRd8kKAZ0IBgxeevv0Xq/Sw8swpjYaReaSe5iNDcLGwDG6HIQekOKQM3GOZn7cCS9Z/Jde2m4ocyBtf5ifFvY7byVJs41IBnHC9T0GB4VchYjHrC+DDVR/65/d2zoZSQsZhwd2aOwH5UySAQKBgQD95Q60hiRKUopioP7OwUL0FSsQWXa4Fqc8a7KGFGLDMmJ3L78YqgIY3HtOBnSziQiVbZJZMYYBUJ/mQ6ZpdZ5PxUFQALppAz6y6o2fChZRjVY5AtIukNRcc7E1Lb6UMYBWho3FkWnLsNhM4gp6fVfDg4HR5JSEPatUkjSoqZuxKQKBgQDPlOBzknHEisaM/cmoXVmkRIWGJ+oZZK7Nz67a6fYjpfr1+RgaKASgSKBHRtVAZYWs3IESEmed+h4c1xl+ueRylOhkDlXix5GlRVZgVnlz4kFv+jK/JiFJO38tH1pdLRfdn+VJBIGW89kQw8T/p3GDgKhB1+oBb6I3aJrEHxMUFwKBgAYm6rhNF8wFO/0v0XzJCgpICQcYY9wKEHtSUL0W+V2pduFUctjyJaLclNBLL8C57U9RnF406P5XKci2ku2zP+bG7NI3ckzhGz/SlyPnZqsLNa+j9dvS/pJO61hSh2+n02hFUmIbJ+kbm+IhCAf3yYyfPyIK295ocCJYeJYtpewhAoGBAIuQnkQ2HvW1FH+xFodzlBSk2V10sqm2Du1jiD25dftL2mrMuo7DfzDBA7pIfpKYb4LkkoczBqWph9t+J68TjuwXABRdqxMZeOw0rTmCipAGfFasUrhAC7swHHabEOd6rQQeQEuSkwqKEtR5u5bj3qc6tmXmpHeotdkpJH1eIzarAoGAMMr+kCdHbGIjQrTfowTU+C0SObLpVZxh1eFhXEehukHJmdM6s9T9Ey17Hstsnt9JMVx7OALZIsRiVTJASsRIGyRhtOw1rK6gscEGdhaaF36SzmcnNGPGqEhVfzqYRSSlBCgCxLvfEr1Gxzd3qWO9KNRQ6vtyvzAIxMZWBxTHdHM= #base64 encoded server key pub=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmZo7SvLBVS0YOwSKDc4+MVMUiFmQLhAnHSuAXUT59YXKWv3bdULmG1K+9rKcU8ZLwpAL+IvmNVA+9DdLJVOhVwGSxCVBpZpWQ3pCx3QUDm+RQUYcZzmKCS9FsR6MOg6u6+rBO5jgjU2+gsR62sSBeHbJizlOlwkTyBQ6U+7Hw0/jR7zcvXN0b0pCXTEb+qnUQrlRvii51miBUtDVOXXp5mC3F6/sUrptpThvcFXOTcmlQriGbmAL/IJ9qmkMOJVCP0jhOQmjJryiqys3milCnoPQcJaTdngp5Hy6w4N9ZOtcNJRc4pOD9IGX4TZQBw+/5IGjEiXs9DIVDWXI7FoEIQIDAQAB enable_traffic_logging=false
-
logback.xml
Example file:
<configuration scan="true" scanPeriod="30 seconds"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logFile.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- daily rollover --> <fileNamePattern>logFile.%d{yyyy-MM-dd_HH:mm:ss}.log</fileNamePattern> <!-- keep 30 days' worth of history --> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root> <appender-ref ref="FILE"/> <appender-ref ref="STDOUT"/> </root> </configuration>
For server/client configuration add to classpath of your application file named refero.properties
, specified values are defaults.
String are passed without quotation marks.
-
Client server threads count:
server_worker_threads=10
client_worker_threads=10
-
If trying to reconnect after server went down, and intervals between reconection atempts for socket version of rpc:
reconnect=false
reconnect_delay=100
-
Timeout to wait for blocking call to finish:
blocking_method_call_timeout=100
-
AES configuration,
cipher_key
is specified as plain text password from which is deriverd 256 bits AES key by performing SHA256 on it:enable_symmetric_encryption=false
cipher_key=
-
RSA configuration,
prv
is own private RSA key stored withPKCS8EncodedKeySpec
and Base64 encoded,pub
is public RSA key of other side stored withX509EncodedKeySpec
and Base64 encoded. Default values results in encryption errors! 2048bit key pair can be generated by running main methode in class classRsaKeyGen
which logs with debug level apropriate string ready to copy past to configuration.enable_asymmetric_encryption=false
prv=
pub=
-
Netty trafic logging configuration:
enable_traffic_logging=false
In this project i used slf4j with Logback as pluged implementation, if you wont to use difrent logging implementation just exclude logback jars from project and add your own implementation.
This project is using
This project contains strong cryptography which is illegal in some countries (AES 256, RSA with 2048 bit key), you are using this software on your own responsibility.
The MIT License
Copyright (c) 2013 Adam Smolarek
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.