微服务迁移记(五):WEB层搭建(1)
WEB层是最终表现层,注册至注册中心,引用接口层(不需要引用实现层)、公共服务层。用户登录使用SpringSecurity,Session保存在redis中,权限管理没有用SpringSecurity那套,自己写了一个简单的菜单、按钮权限控制。我在虚拟机192.168.0.7中搭了一个redis服务。
一、redis搭建
下载redis后,在linux下启动比较简单。需要注意的是redis.config配置:
1. 如果想配置用户名密码
requirepass 123456
2. 如果不bind IP地址,默认只能本机访问
bind 192.168.0.7
写一个批处理startredis.sh,启动redis
./redis-5.0.7/src/redis-server ./redis-5.0.7/redis.conf
二、WEB层主要依赖包
<!--依赖系统管理相关接口工程,供Feign调用,减少冗余代码-->
<dependency>
<groupId>com.zyproject</groupId>
<artifactId>zyproject-api-service-system</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 公共类工程-->
<dependency>
<groupId>com.zyproject</groupId>
<artifactId>zyproject-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- redis,需要注意的是引入commons-pool2,否则会报错 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!--引入feign,远程调用Service服务-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<!--整合freemarker-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!--依赖系统管理相关接口工程-->
<dependency>
<groupId>com.zyproject</groupId>
<artifactId>zyproject-api-service-system</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--spring secrity-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
三、FeignClient通用接口
创建一个接口,继承自接口层ISystemService,这样就可以直接使用Feign实现RPC调用接口实现层暴露出来的http服务了。
package com.zyproject.web.feignclient; import com.zyproject.service.ISystemService;
import org.springframework.cloud.openfeign.FeignClient; /**
* @program: zyproject
* @description: RPC调用系统管理相关接口服务
* @author: zhouyu(zhouyu629 # qq.com)
* @create: 2020-02-11
**/
@FeignClient("zyproject-api-service-system") //注意这里,对应的是接口实现层在注册中心的别名。我这个别名取的有点问题,跟接口层不一样,不合适。
public interface SystemFeign extends ISystemService { }
然后建立一个Service包,里面调用这个Feign接口,最后Controller调用Service即可。以UserService为例:
package com.zyproject.web.service; import com.zyproject.common.ResponseData;
import com.zyproject.web.feignclient.SystemFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam; /**
* @program: zyproject
* @description: 用户服务
* @author: zhouyu(zhouyu629 # qq.com)
* @create: 2020-02-11
**/
@Service
public class UserService {
@Autowired
private SystemFeign systemFeign; //用户登录
public ResponseData userLogin(@RequestParam String user_code, @RequestParam String password){
return systemFeign.userLogin(user_code,password);
} //根据登录名,获取用户信息
public ResponseData findByLoginname(String login_name){
return systemFeign.findByLoginname(login_name);
}
}
有个细节需要注意:
Feign直接调用接口实现RPC,这使得远程调用简单了很多,传递参数可以是一些Java类型,比如传Entity、List、Map等对象。最终底层应该是HttpClient,默认会报错,但可以解决。
但从实际应用角度出发,不建议这样做,向外暴露的http接口,理论上也可以提供给其他应用程序使用,其他开发语言调用,不能限制死是java类型,建议是通过gson或fastjson,将这些类型转换为json字符串进行http参数传递,实现侧再转换回java类型。下面是一个例子:
客户端请求:
/**
* 设置角色权限
* @param role_id
* @param tree_ids:考虑到对其他语言的兼容性,不建议传java类型
* @param btn_ids:考虑到对其他语言的兼容性,不建议传java类型
* @return
*/
public ResponseData setRoleRight(@RequestParam int role_id,
@RequestParam(name = "tree_ids",required = true) String tree_ids,
@RequestParam(name = "btn_ids",required = true) String btn_ids){
return systemFeign.setRoleRight(role_id,tree_ids,btn_ids);
} /**
* 新增或编辑角色
* @param roleEntity:角色信息,Feign前转换为json字符串
* @return
*/
public ResponseData addOrUpdateRole(RoleEntity roleEntity){
String role = new Gson().toJson(roleEntity);
return this.systemFeign.addOrUpdateRole(role);
}
服务端接收(类型转换,应该做容错判断,代码里没有做):
@PostMapping("/setRoleRight")
@ApiOperation("设置角色权限")
@ApiImplicitParams({
@ApiImplicitParam(name = "role_id",value = "角色ID",dataType = "int"),
@ApiImplicitParam(name = "tree_ids", value = "选中的菜单",dataType = "String"),
@ApiImplicitParam(name = "btni_ds",value = "选中的按钮",dataType = "String")
})
@Override
@Transactional
public ResponseData setRoleRight(int role_id, String tree_ids,String btn_ids) {
Gson gson = new Gson();
List<String> tree = gson.fromJson(tree_ids,new TypeToken<List<String>>(){}.getType());
List<Map<String,String>> btn = gson.fromJson(btn_ids,new TypeToken<List<Map<String,String>>>(){}.getType());
boolean result = this.roleDao.setRoleRight(role_id,tree,btn);
return ResponseData.out(result?CodeEnum.SUCCESS:CodeEnum.FAIL,null);
}
@GetMapping("/addOrUpdateRole")
@ApiOperation("新增或修改角色")
@ApiImplicitParams(
@ApiImplicitParam(name = "role",value = "角色实体json字符串")
)
@Override
public ResponseData addOrUpdateRole(String role) {
//将role转换为实体类
boolean result = this.roleDao.addOrUpdateRole(new Gson().fromJson(role,RoleEntity.class));
return ResponseData.out(result?CodeEnum.SUCCESS:CodeEnum.FAIL,null);
}
四、SpringSecurity集成
待续
五、FreeMarker集成
待续
六、权限管理
待续
微服务迁移记(五):WEB层搭建(1)的更多相关文章
- 微服务迁移记(五):WEB层搭建(5)-集成ueditor编辑器,伪分布式图片上传
一.redis搭建 二.WEB层主要依赖包 三.FeignClient通用接口 以上三项,参考<微服务迁移记(五):WEB层搭建(1)> 四.SpringSecurity集成 参考:< ...
- 微服务迁移记(五):WEB层搭建(2)-SpringSecurity集成
一.redis搭建 二.WEB层主要依赖包 三.FeignClient通用接口 以上三项,参考<微服务迁移记(五):WEB层搭建(1)> 接下来,集成SpringSecruity,实现用户 ...
- 微服务迁移记(五):WEB层搭建(3)-FreeMarker集成
一.redis搭建 二.WEB层主要依赖包 三.FeignClient通用接口 以上三项,参考<微服务迁移记(五):WEB层搭建(1)> 四.SpringSecurity集成 参考:< ...
- 微服务迁移记(五):WEB层搭建(4)-简单的权限管理
一.redis搭建 二.WEB层主要依赖包 三.FeignClient通用接口 以上三项,参考<微服务迁移记(五):WEB层搭建(1)> 四.SpringSecurity集成 参考:< ...
- docker微服务部署之:二、搭建文章微服务项目
docker微服务部署之:一,搭建Eureka微服务项目 一.新增demo_article模块,并编写代码 右键demo_parent->new->Module->Maven,选择M ...
- docker微服务部署之:三,搭建Zuul微服务项目
docker微服务部署之:二.搭建文章微服务项目 一.新增demo_eureka模块,并编写代码 右键demo_parent->new->Module->Maven,选择Module ...
- docker微服务部署之:一,搭建Eureka微服务项目
先说明一下docker需要搭建的微服务的基本情况: 项目情况:一个demo_parent项目,下面三个子模块:demo_eureka(eureka服务).demo_article(文章服务).demo ...
- 微服务实践(五):微服务的事件驱动数据管理 - DockOne.io
原文:微服务实践(五):微服务的事件驱动数据管理 - DockOne.io [编者的话]本文是使用微服务创建应用系列的第五篇文章.第一篇文章介绍了微服务架构模式,并且讨论了使用微服务的优缺点:第二和第 ...
- .Net微服务实践(五)[服务发现]:Consul介绍和环境搭建
目录 介绍 服务发现 健康检查.键值存储和数据中心 架构 Consul模式 环境安装 HTTP API 和Command CLI 示例API介绍 最后 在上篇.Net微服务实践(四)[网关]:Ocel ...
随机推荐
- npm tip: go to the package's home page
exec the following order: --- npm home <package name>
- 在具体的前端工作中通常HTML页面乱码怎么解决?
HTML文件乱码一般是因为编码格式不匹配造成的,比如:不同编码内容混杂.浏览器不能自动检测网页编码等等:但无论是哪种情况造成乱码,在HTML文件头中设置网页编码,匹配好编码格式就可. 下面是一个中文乱 ...
- Flv.js文档使用随记
关键字:Flv.js | Flv js | Flv-js | HTML5 FLV Player | 0x001: 前言以下涉及到 flv.js 所有内容均是V1.5.0版本内的,如方法.属性.常量.监 ...
- 「从零单排canal 04」 启动模块deployer源码解析
基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...
- Python 之父说 Python 历史
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:鸿影洲冷 这篇文章主要内容来源于 Python 编程语言的最初设计者 ...
- java 包装类的使用
1.为什么要有包装类(或封装类) 为了使基本数据类型的变量具有类的特征,引入包装类. 2.基本数据类型与对应的包装类: 3.需要掌握的类型间的转换:(基本数据类型.包装类.String) 应用场景举例 ...
- Re5ilio 5ync:资源神器
文章目录 #0x0 简单的介绍 #0x1 安装使用 #0x10 下载 #0x11 安装 #0x12 升级pro权限 #0x13 开始添加资源 #0x14 后续 一定要小心哦!! #0x0 简单的介绍 ...
- CSS(二)- 属性速览(含版本、继承性和简介)
相关链接 CSS3速查表,这里面列出了所有新增的属性以及新增或者修改的属性值 css参考手册,很好地一个常用网站 CSS定位(不可继承) CSS布局(仅visibility可继承) CSS尺寸(不可继 ...
- Android 性能优化 ---- 启动优化
Android 性能优化 ---- 启动优化 1.为什么要进行启动优化 一款应用的第一印象很重要,第一印象往往决定了用户的去留.打开一款应用,如果速度很快,很顺畅,那么很容易让人觉得这款应用背后的技术 ...
- 爬虫黑科技,我是怎么爬取indeed的职位数据的
最近在学习nodejs爬虫技术,学了request模块,所以想着写一个自己的爬虫项目,研究了半天,最后选定indeed作为目标网站,通过爬取indeed的职位数据,然后开发一个自己的职位搜索引擎,目前 ...