diff --git a/sop-example/sop-book/sop-book-web/pom.xml b/sop-example/sop-book/sop-book-web/pom.xml index 125d2570..95909470 100644 --- a/sop-example/sop-book/sop-book-web/pom.xml +++ b/sop-example/sop-book/sop-book-web/pom.xml @@ -16,6 +16,7 @@ 1.8 + 2.6.5 Greenwich.RELEASE @@ -44,6 +45,22 @@ spring-cloud-starter-openfeign + + + com.alibaba.boot + dubbo-spring-boot-starter + 0.2.1.RELEASE + + + com.alibaba + dubbo + ${dubbo.version} + + + io.netty + netty-all + + io.springfox diff --git a/sop-example/sop-book/sop-book-web/src/main/java/com/gitee/sop/bookweb/controller/AlipayBookController.java b/sop-example/sop-book/sop-book-web/src/main/java/com/gitee/sop/bookweb/controller/AlipayBookController.java index 1897b84e..eff28c56 100644 --- a/sop-example/sop-book/sop-book-web/src/main/java/com/gitee/sop/bookweb/controller/AlipayBookController.java +++ b/sop-example/sop-book/sop-book-web/src/main/java/com/gitee/sop/bookweb/controller/AlipayBookController.java @@ -42,7 +42,7 @@ public class AlipayBookController { return story; } - // 调用story服务 + // 通过Feign调用story服务 @ApiMapping(value = "alipay.book.story.get") public Object getBook2() { Story story = new Story(); diff --git a/sop-example/sop-book/sop-book-web/src/main/java/com/gitee/sop/bookweb/controller/DemoConsumerController.java b/sop-example/sop-book/sop-book-web/src/main/java/com/gitee/sop/bookweb/controller/DemoConsumerController.java new file mode 100644 index 00000000..016be701 --- /dev/null +++ b/sop-example/sop-book/sop-book-web/src/main/java/com/gitee/sop/bookweb/controller/DemoConsumerController.java @@ -0,0 +1,49 @@ +package com.gitee.sop.bookweb.controller; + +import com.alibaba.dubbo.config.annotation.Reference; +import com.gitee.sop.servercommon.annotation.ApiMapping; +import com.gitee.sop.story.api.param.DemoParam; +import com.gitee.sop.story.api.result.DemoResult; +import com.gitee.sop.story.api.service.DemoService; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * 调用dubbo服务,provider是story,见DefaultDemoService.java + * dubbo配置方式参见:https://github.com/apache/dubbo-spring-boot-project/blob/0.2.x/README_CN.md + * + * 对比SpringCloud提供的Feign,dubbo会方便很多。 + * + * Feign的使用方式参见:com.gitee.sop.bookweb.controller.AlipayBookController#getBook2() + */ +@RestController +public class DemoConsumerController { + + @Reference(version = "${demo.service.version}", + application = "${dubbo.application.id}", + url = "dubbo://localhost:12345") + private DemoService demoService; + + // http://localhost:3333/sayHello?name=jim + @RequestMapping("/sayHello") + public String sayHello(@RequestParam String name) { + return demoService.sayHello(name); + } + + // http://localhost:3333/dubboStory + @RequestMapping("/dubboStory") + public DemoResult dubboStory() { + DemoParam demoParam = new DemoParam(); + demoParam.setId(1); + return demoService.getStory(demoParam); + } + + // 作为开放接口 + @ApiMapping(value = "dubbo.story.get") + public DemoResult openApi(DemoParam demoParam) { + // 通过dubbo调用story提供的服务 + return demoService.getStory(demoParam); + } + +} \ No newline at end of file diff --git a/sop-example/sop-book/sop-book-web/src/main/resources/application-dev.yml b/sop-example/sop-book/sop-book-web/src/main/resources/application-dev.yml index 4c2989d5..edb92dec 100644 --- a/sop-example/sop-book/sop-book-web/src/main/resources/application-dev.yml +++ b/sop-example/sop-book/sop-book-web/src/main/resources/application-dev.yml @@ -15,4 +15,19 @@ eureka: host: localhost client: serviceUrl: - defaultZone: http://${eureka.host}:${eureka.port}/eureka/ \ No newline at end of file + defaultZone: http://${eureka.host}:${eureka.port}/eureka/ + +# dubbo consumer +demo: + service: + version: 1.0.0 +dubbo: + application: + id: dubbo-consumer-demo + name: dubbo-consumer-demo + protocol: + id: dubbo + name: dubbo + port: 12345 +management: + port: 8081 \ No newline at end of file diff --git a/sop-example/sop-story/sop-story-api/src/main/java/com/gitee/sop/story/api/param/DemoParam.java b/sop-example/sop-story/sop-story-api/src/main/java/com/gitee/sop/story/api/param/DemoParam.java new file mode 100644 index 00000000..36a0ce3c --- /dev/null +++ b/sop-example/sop-story/sop-story-api/src/main/java/com/gitee/sop/story/api/param/DemoParam.java @@ -0,0 +1,14 @@ +package com.gitee.sop.story.api.param; + +import lombok.Data; + +import java.io.Serializable; + +/** + * dubbo 参数 + * @author tanghc + */ +@Data +public class DemoParam implements Serializable { + private int id; +} diff --git a/sop-example/sop-story/sop-story-api/src/main/java/com/gitee/sop/story/api/result/DemoResult.java b/sop-example/sop-story/sop-story-api/src/main/java/com/gitee/sop/story/api/result/DemoResult.java new file mode 100644 index 00000000..3be828f5 --- /dev/null +++ b/sop-example/sop-story/sop-story-api/src/main/java/com/gitee/sop/story/api/result/DemoResult.java @@ -0,0 +1,15 @@ +package com.gitee.sop.story.api.result; + +import lombok.Data; + +import java.io.Serializable; + +/** + * dubbo返回结果 + * @author tanghc + */ +@Data +public class DemoResult implements Serializable { + private int id; + private String name; +} diff --git a/sop-example/sop-story/sop-story-api/src/main/java/com/gitee/sop/story/api/service/DemoService.java b/sop-example/sop-story/sop-story-api/src/main/java/com/gitee/sop/story/api/service/DemoService.java new file mode 100644 index 00000000..67c382d7 --- /dev/null +++ b/sop-example/sop-story/sop-story-api/src/main/java/com/gitee/sop/story/api/service/DemoService.java @@ -0,0 +1,17 @@ +package com.gitee.sop.story.api.service; + +import com.gitee.sop.story.api.param.DemoParam; +import com.gitee.sop.story.api.result.DemoResult; + +public interface DemoService { + + String sayHello(String name); + + /** + * 获取故事名称 + * @param param + * @return + */ + DemoResult getStory(DemoParam param); + +} \ No newline at end of file diff --git a/sop-example/sop-story/sop-story-web/pom.xml b/sop-example/sop-story/sop-story-web/pom.xml index d6bd98b0..4bfe3a49 100644 --- a/sop-example/sop-story/sop-story-web/pom.xml +++ b/sop-example/sop-story/sop-story-web/pom.xml @@ -16,6 +16,7 @@ 1.8 + 2.6.5 Greenwich.RELEASE @@ -39,6 +40,23 @@ spring-cloud-starter-openfeign + + + com.alibaba.boot + dubbo-spring-boot-starter + 0.2.1.RELEASE + + + com.alibaba + dubbo + ${dubbo.version} + + + io.netty + netty-all + + + io.springfox @@ -84,6 +102,7 @@ pom import + diff --git a/sop-example/sop-story/sop-story-web/src/main/java/com/gitee/sop/storyweb/service/DefaultDemoService.java b/sop-example/sop-story/sop-story-web/src/main/java/com/gitee/sop/storyweb/service/DefaultDemoService.java new file mode 100644 index 00000000..3d4dde31 --- /dev/null +++ b/sop-example/sop-story/sop-story-web/src/main/java/com/gitee/sop/storyweb/service/DefaultDemoService.java @@ -0,0 +1,29 @@ +package com.gitee.sop.storyweb.service; + +import com.alibaba.dubbo.config.annotation.Service; +import com.gitee.sop.story.api.param.DemoParam; +import com.gitee.sop.story.api.result.DemoResult; +import com.gitee.sop.story.api.service.DemoService; +import org.springframework.beans.factory.annotation.Value; + +@Service(version = "1.0.0") +public class DefaultDemoService implements DemoService { + + /** + * The default value of ${dubbo.application.name} is ${spring.application.name} + */ + @Value("${dubbo.application.name}") + private String serviceName; + + public String sayHello(String name) { + return String.format("[%s] : Hello, %s", serviceName, name); + } + + @Override + public DemoResult getStory(DemoParam param) { + DemoResult demoResult = new DemoResult(); + demoResult.setId(2); + demoResult.setName("dubbo 白雪公主, param=" + param); + return demoResult; + } +} \ No newline at end of file diff --git a/sop-example/sop-story/sop-story-web/src/main/resources/application-dev.yml b/sop-example/sop-story/sop-story-web/src/main/resources/application-dev.yml index 6130f136..3a06f369 100644 --- a/sop-example/sop-story/sop-story-web/src/main/resources/application-dev.yml +++ b/sop-example/sop-story/sop-story-web/src/main/resources/application-dev.yml @@ -16,4 +16,14 @@ eureka: host: localhost client: serviceUrl: - defaultZone: http://${eureka.host}:${eureka.port}/eureka/ \ No newline at end of file + defaultZone: http://${eureka.host}:${eureka.port}/eureka/ + +# dubbo provider +dubbo: + protocol: + name: dubbo + port: 12345 + registry: + address: N/A + scan: + base-packages: com.gitee.sop.storyweb.service diff --git a/sop-test/src/test/java/com/gitee/sop/DubboDemoTest.java b/sop-test/src/test/java/com/gitee/sop/DubboDemoTest.java new file mode 100644 index 00000000..63c241d3 --- /dev/null +++ b/sop-test/src/test/java/com/gitee/sop/DubboDemoTest.java @@ -0,0 +1,58 @@ +package com.gitee.sop; + +import com.alibaba.fastjson.JSON; +import com.gitee.sop.alipay.AlipaySignature; +import org.junit.Test; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 测试dubbo服务调用,需要启动book服务 + * @author tanghc + */ +public class DubboDemoTest extends TestBase { + + String url = "http://localhost:8081/api"; // zuul + String appId = "2019032617262200001"; + // 支付宝私钥 + String privateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCXJv1pQFqWNA/++OYEV7WYXwexZK/J8LY1OWlP9X0T6wHFOvxNKRvMkJ5544SbgsJpVcvRDPrcxmhPbi/sAhdO4x2PiPKIz9Yni2OtYCCeaiE056B+e1O2jXoLeXbfi9fPivJZkxH/tb4xfLkH3bA8ZAQnQsoXA0SguykMRZntF0TndUfvDrLqwhlR8r5iRdZLB6F8o8qXH6UPDfNEnf/K8wX5T4EB1b8x8QJ7Ua4GcIUqeUxGHdQpzNbJdaQvoi06lgccmL+PHzminkFYON7alj1CjDN833j7QMHdPtS9l7B67fOU/p2LAAkPMtoVBfxQt9aFj7B8rEhGCz02iJIBAgMBAAECggEARqOuIpY0v6WtJBfmR3lGIOOokLrhfJrGTLF8CiZMQha+SRJ7/wOLPlsH9SbjPlopyViTXCuYwbzn2tdABigkBHYXxpDV6CJZjzmRZ+FY3S/0POlTFElGojYUJ3CooWiVfyUMhdg5vSuOq0oCny53woFrf32zPHYGiKdvU5Djku1onbDU0Lw8w+5tguuEZ76kZ/lUcccGy5978FFmYpzY/65RHCpvLiLqYyWTtaNT1aQ/9pw4jX9HO9NfdJ9gYFK8r/2f36ZE4hxluAfeOXQfRC/WhPmiw/ReUhxPznG/WgKaa/OaRtAx3inbQ+JuCND7uuKeRe4osP2jLPHPP6AUwQKBgQDUNu3BkLoKaimjGOjCTAwtp71g1oo+k5/uEInAo7lyEwpV0EuUMwLA/HCqUgR4K9pyYV+Oyb8d6f0+Hz0BMD92I2pqlXrD7xV2WzDvyXM3s63NvorRooKcyfd9i6ccMjAyTR2qfLkxv0hlbBbsPHz4BbU63xhTJp3Ghi0/ey/1HQKBgQC2VsgqC6ykfSidZUNLmQZe3J0p/Qf9VLkfrQ+xaHapOs6AzDU2H2osuysqXTLJHsGfrwVaTs00ER2z8ljTJPBUtNtOLrwNRlvgdnzyVAKHfOgDBGwJgiwpeE9voB1oAV/mXqSaUWNnuwlOIhvQEBwekqNyWvhLqC7nCAIhj3yvNQKBgQCqYbeec56LAhWP903Zwcj9VvG7sESqXUhIkUqoOkuIBTWFFIm54QLTA1tJxDQGb98heoCIWf5x/A3xNI98RsqNBX5JON6qNWjb7/dobitti3t99v/ptDp9u8JTMC7penoryLKK0Ty3bkan95Kn9SC42YxaSghzqkt+uvfVQgiNGQKBgGxU6P2aDAt6VNwWosHSe+d2WWXt8IZBhO9d6dn0f7ORvcjmCqNKTNGgrkewMZEuVcliueJquR47IROdY8qmwqcBAN7Vg2K7r7CPlTKAWTRYMJxCT1Hi5gwJb+CZF3+IeYqsJk2NF2s0w5WJTE70k1BSvQsfIzAIDz2yE1oPHvwVAoGAA6e+xQkVH4fMEph55RJIZ5goI4Y76BSvt2N5OKZKd4HtaV+eIhM3SDsVYRLIm9ZquJHMiZQGyUGnsvrKL6AAVNK7eQZCRDk9KQz+0GKOGqku0nOZjUbAu6A2/vtXAaAuFSFx1rUQVVjFulLexkXR3KcztL1Qu2k5pB6Si0K/uwQ="; + + // 测试dubbo服务,book会调用story提供的服务。参见:DemoConsumerController.java + @Test + public void testDemo() throws Exception { + // 公共请求参数 + Map params = new HashMap(); + params.put("app_id", appId); + params.put("method", "dubbo.story.get"); + params.put("format", "json"); + params.put("charset", "utf-8"); + params.put("sign_type", "RSA2"); + params.put("timestamp", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + params.put("version", "1.0"); + + // 业务参数 + Map bizContent = new HashMap<>(); + bizContent.put("id", "222"); + + params.put("biz_content", JSON.toJSONString(bizContent)); + + System.out.println("----------- 请求信息 -----------"); + System.out.println("请求参数:" + buildParamQuery(params)); + System.out.println("商户秘钥:" + privateKey); + String content = AlipaySignature.getSignContent(params); + System.out.println("待签名内容:" + content); + String sign = AlipaySignature.rsa256Sign(content, privateKey, "utf-8"); + System.out.println("签名(sign):" + sign); + + params.put("sign", sign); + + System.out.println("----------- 返回结果 -----------"); + String responseData = post(url, params);// 发送请求 + System.out.println(responseData); + } + + +}