SpringBoot与Dubbo3结合构建RESTful服务有哪些优势与挑战?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1404个文字,预计阅读时间需要6分钟。
目录
一、前言
二、Dubbo适用场景
1.内部单体应用微服务化
2.应用服务更多面向内部服务调用
3.服务管理趋于精细化
三、Dubbo微服务治理过程中的一个难题
四、与Spring Boot的整合
目录
- 一、前言
- 二、dubbo适用场景
- 1、内部单体应用微服务化
- 2、应用服务更多面向内部服务间调用
- 3、对服务管理趋于精细化
- 三、dubbo微服务治理过程中的一个难题
- 四、与springboot的整合使用
- 1、公共pom依赖
- 2、common-service 模块
- 3、provider-demo 模块
- pom依赖
- 核心配置文件
- 服务实现类
- 启动类
- 4、consumer-demo 模块
- 4、接口测试
- 4.1 启动zookeeper服务
- 4.2启动provider服务
- 4.3启动consumer服务
- 4.4接口测试
一、前言
作为微服务治理生态体系内的重要框架 dubbo,从出身到现在历经了十多年的市场检验而依旧火热,除了其自身优秀的设计,高性能的RPC性能,以及依托于springcloud-alibaba的这个背后强劲的开源团队支撑,在众多的微服务架构选型中,成为很多架构设计者们不可或缺的选择之一。
二、dubbo适用场景
关于dubbo的具体技术点,本篇不做过多介绍,网上的参考资料较多,下面谈几点使用dubbo的技术选型场景,提供参考:
1、内部单体应用微服务化
很多创业型公司,一开始喜欢采用单体服务,随着业务量增大,单体架构很难支撑随之而来的业务并发量,为了减少单体应用向微服务转型的难度,dubbo是一个不错的选择,相比 springcloud 或者springcloud-alibaba,dubbo可以说在极少依赖过多微服务组件的基础上就可以完成微服务化的过渡。
2、应用服务更多面向内部服务间调用
如果你所在的系统或平台,在大多数情况下,需要面对的是微服务之间的调用,而很少对外提供服务接口,dubbo肯定是首选。我们知道springcloud走的是127.0.0.1:2181 dubbo.protocols.p1.id=dubbo-one dubbo.protocols.p1.name=dubbo dubbo.protocols.p1.port=20881 dubbo.protocols.p1.host=0.0.0.0 dubbo.protocols.p2.id=rest-two dubbo.protocols.p2.name=rest dubbo.protocols.p2.port=8082 dubbo.protocols.p2.host=0.0.0.0
服务实现类
注意,类上面的 Service 注解是dubbo的,同时,里面的 protocol 同时支持 dubbo协议和rest协议,这也是dubbo 2.7.X之后的新特性;
而使用 Path 注解,就很像我们在一个Controller接口类上面定义的请求路径;
import com.congge.entity.User; import org.apache.dubbo.common.URL; import org.apache.dubbo.config.annotation.Service; import org.apache.dubbo.rpc.RpcContext; import org.apache.dubbo.rpc.protocol.rest.support.ContentType; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; @Service(version = "rest", protocol = {"p2","p1"}) @Path("user") public class ProviderRestService implements UserService { @GET @Path("getByUserId") @Produces({ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8}) @Override public User getByUserId(@QueryParam("userId")String userId) { return new User(userId,"zhangsan","杭州"); } @GET @Path("sayHello") @Produces({ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8}) @Override public String sayHello(@QueryParam("name") String name) { System.out.println("执行了rest服务" + name); URL url = RpcContext.getContext().getUrl(); return String.format("%s: %s, Hello, %s", url.getProtocol(), url.getPort(), name); } }
启动类
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ProviderApp { public static void main(String[] args) { SpringApplication.run(ProviderApp.class, args); } }
4、consumer-demo 模块
pom依赖和provider里面保持一致即可
核心配置文件
spring: application: name: dubbo-consumer server: port: 8083 dubbo: registry: address: zookeeper://127.0.0.1:2181
接口层MyUserController
这里为了演示方便,定义了一个控制器,方便后面的测试,这里写了两种方式的接口,即通过默认的dubbo协议调用方式,以及采用rest接口方式调用,所以注入了RestTemplate ,相信有过微服务开发经验的同学能看懂;
import com.congge.entity.User; import com.congge.service.UserService; import org.apache.dubbo.config.annotation.Reference; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class MyUserController { @Autowired private RestTemplate restTemplate; @Reference(version = "rest") private UserService demoService; //localhost:8083/getUser @GetMapping("/getUser") public Object getUserInfo(){ String result = demoService.sayHello("hello provider"); return result; } //localhost:8083/getUserById @GetMapping("/getUserById") public Object getUserById(){ User dbUser = demoService.getByUserId("001"); return dbUser; } //localhost:8083/getByRest @GetMapping("/getByRest") public Object getByRest(){ User forObject = restTemplate.getForObject("localhost:8082/user/getByUserId?userId=0001", User.class); return forObject; } }
启动类
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ConsumerApp { public static void main(String[] args) { SpringApplication.run(ConsumerApp.class); } }
4、接口测试
4.1 启动zookeeper服务
4.2启动provider服务
4.3启动consumer服务
4.4接口测试
模拟正常的dubbo接口调用,调用接口:localhost:8083/getUser,浏览器执行调用
模拟rest接口调用,调用接口:localhost:8083/getByRest,执行调用观察效果
通过上述的案例演示,我们了解了如何使用dubbo的rest协议开发一个服务接口,可以这么讲,有了这种rest协议之后,对于服务提供端来说,同样的服务实现类既可以作为dubbo服务暴露出去,同样可以rest的方式被调用,这对于跨平台,跨语言的应用来说,无疑是一种很好的选择;
但是上面演示的方式仅仅是其中一种,更详细的dubbo rest 开发可以参考dubbo rest开发规范说明,本篇到这里就结束了,感谢观看!
到此这篇关于springboot整合dubbo3开发rest应用的文章就介绍到这了,更多相关springboot整合dubbo3内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!
本文共计1404个文字,预计阅读时间需要6分钟。
目录
一、前言
二、Dubbo适用场景
1.内部单体应用微服务化
2.应用服务更多面向内部服务调用
3.服务管理趋于精细化
三、Dubbo微服务治理过程中的一个难题
四、与Spring Boot的整合
目录
- 一、前言
- 二、dubbo适用场景
- 1、内部单体应用微服务化
- 2、应用服务更多面向内部服务间调用
- 3、对服务管理趋于精细化
- 三、dubbo微服务治理过程中的一个难题
- 四、与springboot的整合使用
- 1、公共pom依赖
- 2、common-service 模块
- 3、provider-demo 模块
- pom依赖
- 核心配置文件
- 服务实现类
- 启动类
- 4、consumer-demo 模块
- 4、接口测试
- 4.1 启动zookeeper服务
- 4.2启动provider服务
- 4.3启动consumer服务
- 4.4接口测试
一、前言
作为微服务治理生态体系内的重要框架 dubbo,从出身到现在历经了十多年的市场检验而依旧火热,除了其自身优秀的设计,高性能的RPC性能,以及依托于springcloud-alibaba的这个背后强劲的开源团队支撑,在众多的微服务架构选型中,成为很多架构设计者们不可或缺的选择之一。
二、dubbo适用场景
关于dubbo的具体技术点,本篇不做过多介绍,网上的参考资料较多,下面谈几点使用dubbo的技术选型场景,提供参考:
1、内部单体应用微服务化
很多创业型公司,一开始喜欢采用单体服务,随着业务量增大,单体架构很难支撑随之而来的业务并发量,为了减少单体应用向微服务转型的难度,dubbo是一个不错的选择,相比 springcloud 或者springcloud-alibaba,dubbo可以说在极少依赖过多微服务组件的基础上就可以完成微服务化的过渡。
2、应用服务更多面向内部服务间调用
如果你所在的系统或平台,在大多数情况下,需要面对的是微服务之间的调用,而很少对外提供服务接口,dubbo肯定是首选。我们知道springcloud走的是127.0.0.1:2181 dubbo.protocols.p1.id=dubbo-one dubbo.protocols.p1.name=dubbo dubbo.protocols.p1.port=20881 dubbo.protocols.p1.host=0.0.0.0 dubbo.protocols.p2.id=rest-two dubbo.protocols.p2.name=rest dubbo.protocols.p2.port=8082 dubbo.protocols.p2.host=0.0.0.0
服务实现类
注意,类上面的 Service 注解是dubbo的,同时,里面的 protocol 同时支持 dubbo协议和rest协议,这也是dubbo 2.7.X之后的新特性;
而使用 Path 注解,就很像我们在一个Controller接口类上面定义的请求路径;
import com.congge.entity.User; import org.apache.dubbo.common.URL; import org.apache.dubbo.config.annotation.Service; import org.apache.dubbo.rpc.RpcContext; import org.apache.dubbo.rpc.protocol.rest.support.ContentType; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; @Service(version = "rest", protocol = {"p2","p1"}) @Path("user") public class ProviderRestService implements UserService { @GET @Path("getByUserId") @Produces({ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8}) @Override public User getByUserId(@QueryParam("userId")String userId) { return new User(userId,"zhangsan","杭州"); } @GET @Path("sayHello") @Produces({ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8}) @Override public String sayHello(@QueryParam("name") String name) { System.out.println("执行了rest服务" + name); URL url = RpcContext.getContext().getUrl(); return String.format("%s: %s, Hello, %s", url.getProtocol(), url.getPort(), name); } }
启动类
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ProviderApp { public static void main(String[] args) { SpringApplication.run(ProviderApp.class, args); } }
4、consumer-demo 模块
pom依赖和provider里面保持一致即可
核心配置文件
spring: application: name: dubbo-consumer server: port: 8083 dubbo: registry: address: zookeeper://127.0.0.1:2181
接口层MyUserController
这里为了演示方便,定义了一个控制器,方便后面的测试,这里写了两种方式的接口,即通过默认的dubbo协议调用方式,以及采用rest接口方式调用,所以注入了RestTemplate ,相信有过微服务开发经验的同学能看懂;
import com.congge.entity.User; import com.congge.service.UserService; import org.apache.dubbo.config.annotation.Reference; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class MyUserController { @Autowired private RestTemplate restTemplate; @Reference(version = "rest") private UserService demoService; //localhost:8083/getUser @GetMapping("/getUser") public Object getUserInfo(){ String result = demoService.sayHello("hello provider"); return result; } //localhost:8083/getUserById @GetMapping("/getUserById") public Object getUserById(){ User dbUser = demoService.getByUserId("001"); return dbUser; } //localhost:8083/getByRest @GetMapping("/getByRest") public Object getByRest(){ User forObject = restTemplate.getForObject("localhost:8082/user/getByUserId?userId=0001", User.class); return forObject; } }
启动类
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ConsumerApp { public static void main(String[] args) { SpringApplication.run(ConsumerApp.class); } }
4、接口测试
4.1 启动zookeeper服务
4.2启动provider服务
4.3启动consumer服务
4.4接口测试
模拟正常的dubbo接口调用,调用接口:localhost:8083/getUser,浏览器执行调用
模拟rest接口调用,调用接口:localhost:8083/getByRest,执行调用观察效果
通过上述的案例演示,我们了解了如何使用dubbo的rest协议开发一个服务接口,可以这么讲,有了这种rest协议之后,对于服务提供端来说,同样的服务实现类既可以作为dubbo服务暴露出去,同样可以rest的方式被调用,这对于跨平台,跨语言的应用来说,无疑是一种很好的选择;
但是上面演示的方式仅仅是其中一种,更详细的dubbo rest 开发可以参考dubbo rest开发规范说明,本篇到这里就结束了,感谢观看!
到此这篇关于springboot整合dubbo3开发rest应用的文章就介绍到这了,更多相关springboot整合dubbo3内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

