一、 系统部署图
说明:
由于dubbo消费者和提供者服务适合内部网络环境下的服务调用协同,所谓内部网络环境就是dubbo消费者和服务者部署服务器的IP和端口不需要映射转换就能畅通访问的网络环境,这是有dubbo暴露服务的方式决定的。
所以dubbo提供者在为内部消费者提供服务同时,还要对外提供服务的话,我这边就通过http代理的访问进行访问。就是上图所说的“http代理服务”。这个服务程序可以满足集群负载部署,其核心要点是要部署在能内外网穿透的区域,其原因如下:
1)我们要通过“dubbo管理平台”针对对外服务进行访问权限,及IP白名单管理。这些配置数据信息(连接内网数据库)http的代理程序必须能够访问得到才能对服务进行控制。
2)只有“http代理服务”实现了内外网络的畅通,才能保证http进行访问。
“Dubbo管理平台”实现了消费者服务进行屏蔽,恢复调用,对提供者进行禁用与恢复禁用,服务调用成功/失败结果进行统计,对外服务ip白名单,对外服务授权等功能。
二、 代码编写规范
2.1消费者服务编码规范
1)配置文件
消费者服务配置文件说明:
<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --> <dubbo:application name="dubbo-consumer" /> <!-- 必须引入,用于服务监控--> <dubbo:monitor protocol="registry" /> <!-- 使用zookeeper注册中心暴露服务地址 --> <!-- 注册中心地址 --> <dubbo:registry protocol="zookeeper" address="${dubbo.registry.address}" client="curator" /> <!-- 用户服务接口 --> <dubbo:reference interface="com.ws.facade.UserFacade" id="userFacadeClient" check="false"/> |
消费者spring mvc配置文件特别说明:
<!-- json转换时要加些配置,不然json字符串可能会多一串引号--> <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter" /> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" /> </mvc:message-converters> </mvc:annotation-driven> |
2)java代码编写说明
请求参数说明:
所有的请求及接口的参数统一用Map<String,String>处理,返回用ResponseUtil封装,接口实例代码如下:
package com.ws.facade;
import java.util.Map;
import com.dubboproxy.utils.ResponseUtil;
/** * Description: com.ws.facade */ public interface UserFacade { ResponseUtil readMsg(Map<String, String> arg) throws RuntimeException;
} |
2.2对外代理客户端编码规范
1)配置文件
对外代理客户端spring mvc配置文件特别说明:
<mvc:message-converters register-defaults="false"> <!--先进行string转换会去掉字符串的多余引号--> <bean class="org.springframework.http.converter.StringHttpMessageConverter" />
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>application/json</value> </list> </property> <property name="features"> <list> <value>WriteMapNullValue</value> <value>QuoteFieldNames</value> <value>WriteDateUseDateFormat</value> </list> </property> </bean> </mvc:message-converters> |
2)http代理配置信息
配置内容(resource目录下要有config.properties这个文件):
dubboProxy=http://localhost:8080/manage-proxy/httpproxy.shtml dubboSysKey=admin certName=PublicKey |
3)spring mvc 调用案例:
package com.ws; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.sdubbo.util.*; /** * * @author panda *下午9:29:57 */ @RestController @RequestMapping("/sys/dubboip") public class DubboIpListController { /* * 查询数据 * 固定参数: * page是第几页 * limit是每页限制几行 * 参数最终必须用map封装 */ @RequestMapping(value = "/listdata") public ResponseUtil listdata(String ip, Integer page, Integer limit) throws IOException { Map parames = new HashMap(); parames.put("ip", ip); parames.put("page",page); parames.put("limit", limit); String serviceid="fami_com.crossoverJie.api.DemoApi";/*对外服务id*/ String json_str=DubboHttpUtil.httpcontrol(serviceid, parames); /*参数必须用map*/ Result result=JSON.parseObject(json_str.toString(),new TypeReference<Result>(){}); return ResponseUtil.success().put(result.getResultdata()); } } |
此外,在resource目录还要加入PublicKey文件。
2.3提供者服务编码规范
1)服务提供者配置文件:
<!-- 这个是必须引入,用于http代理 --> <context:component-scan base-package="com.dubboproxy.controller" /> <!-- 这个是必须引入,提供方应用信息,用于计算依赖关系 --> <dubbo:application name="dubbo-provider2" /> <!-- 这个是必须引入,使用zookeeper注册中心暴露服务地址 --> <dubbo:registry protocol="zookeeper" file="${catalina.home}/dubbo-registry/dubbo-provider2.properties" address="${dubbo.registry.address}" client="curator" /> <!-- 这个是必须引入,用dubbo协议在20882端口暴露服务 --> <dubbo:protocol name="dubbo" port="20882" /> <!-- 这个是必须引入,用于服务监控,没有此配置,服务不会被监控 --> dubbo:monitor protocol="registry" /> <!-- 以下是提供的具体服务配置,根据实际情况 --> <bean id="userFacade" class="com.ws.facade.impl.UserFacadeImpl" /> <!-- 用户服务接口 --> <dubbo:service interface="com.ws.facade.UserFacade" ref="userFacade" /> |
2)java接口编码规范
package com.ws.facade; import java.util.Map; import com.dubboproxy.utils.ResponseUtil; /** * Description: com.ws.facade 必须是map<String,String>入参 */ public interface UserFacade { ResponseUtil readMsg(Map<String, String> arg) throws RuntimeException; } |
接口实现案例
package com.ws.facade.impl; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import com.dubboproxy.utils.PageUtils; import com.dubboproxy.utils.ResponseUtil; import com.ws.entity.DubboIpListEntity; import com.ws.facade.UserFacade; import com.ws.service.DubboIpListService; public class UserFacadeImpl implements UserFacade{ @Autowired private DubboIpListService dubboiplistservice; /** 返回ResponseUtil类型 **/ public ResponseUtil readMsg(Map<String, String> param) throws RuntimeException { String ip=param.get("ip"); Integer limit=Integer.valueOf(param.get("limit")) ;
Integer page=Integer.valueOf( param.get("page")); Map<String, Object> map =new HashMap<String, Object>(); map.put("ip",param.get("ip")); map.put("limit", limit); map.put("offset", (page - 1) * limit); List<DubboIpListEntity> dubboiplist = dubboiplistservice.findDubboIpList(map); int total = dubboiplistservice.findDubboIpListCount(ip); PageUtils pageUtil = new PageUtils(dubboiplist, total, limit, page); return ResponseUtil.success().put(pageUtil); } } |
提供者需要引入jar:
<dependency> <groupId>com.providerhttp</groupId> <artifactId>providerhttp</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> |
代理客户端需要引入jar:
<dependency> <groupId>com.dubbohttp</groupId> <artifactId>dubbohttp</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> |
三、 Dubbo管理平台介绍
利用zookeeper作为注册中心,mysql数据管理存储。
3.1首页
说明:
用户进入后能看到左边的菜单栏还有右边会显示服务方法被成功调用的次数。
3.2系统管理
说明:
管理员列表 | 对用户增删改查操作 |
角色管理 | 对角色增删改查操作 |
菜单管理 | 对显示菜单增删改查操作 |
服务类型管理 | 对服务类型及对应名称管理 |
服务组管理 | 对服务对应组进行管理 |
3.3dubbo代理管理
说明:
对外IP白名单 | 只有配置了IP白名单才能保证访问 |
代理服务列表 | 对服务进行启用/禁用操作 |
对外服务配置 | 对服务进行映射性配置 |
用户组授权 | 给服务进行组归类 |
3.4dubbo资源中心
说明
消费者服务列表 | 对消费者进行屏蔽/启用管理 |
提供者服务类别 | 对提供者进行启用/禁用管理 |