目录
SSO单点登录(一)理论知识总结
SSO单点登录(二)基于redis的服务端
SSO单点登录(三)基于session的服务端
SSO单点登录(四)客户端的设计与实现
SSO单点登录(五)服务端集成dubbo版本
持续更新中…
回顾一下章节二、三,写的都是服务端,也就是SSO中心要做的事情,但是提供都是http接口,所以章节四对接的时候用的http接口去请求的,那么集成dubbo,利用rpc接口如何实现呢?
第一步 依赖少不了
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<curator-framework.version>4.0.1</curator-framework.version>
<zookeeper.version>3.4.13</zookeeper.version>
<dubbo.starter.version>0.2.0</dubbo.starter.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.starter.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator-framework.version}</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
第二步 rpc接口出入参定义
- 入参
import lombok.Data;
import java.io.Serializable;
/**
* @author yanghao
* @version ApplyAuthParam.java, v 0.1 2019-07-02 08:06
*/
@Data
public class ApplyAuthParam implements Serializable {
private static final long serialVersionUID = -1192199423675016946L;
/**
* 登录token
*/
private String token;
/**
* 跳转url
*/
private String indexUrl;
}
- 出参
import lombok.Data;
import java.io.Serializable;
/**
* @author yanghao
* @version ApiResult.java, v 0.1 2019-07-02 08:08
*/
@Data
public class ApiResult<T> implements Serializable {
private static final long serialVersionUID = -2547026529446900321L;
/**
* 请求是否成功
*/
private boolean success;
/**
* 返回的的数据
*/
private T data;
/**
* 错误代码
*/
private String errorCode;
/**
* 错误消息
*/
private String errorMsg;
/**
* 成功请求
* success : true
* errorCode : 默认 2000
* errorMsg : 默认 ""
*/
public static <T> ApiResult<T> success(T data) {
return new ApiResult<>(true, data, "2000", "");
}
public static <T> ApiResult<T> error(String errorCode, String errorMsg) {
return new ApiResult<>(false, null, errorCode, errorMsg);
}
public ApiResult(boolean success, T data, String errorCode, String errorMsg) {
this.success = success;
this.data = data;
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
}
第三步 包装rpc接口
- facade接口
/**
* @author yanghao
* @version AuthFacade.java, v 0.1 2019-07-02 08:12
*/
public interface AuthFacade {
/**
* Desc: 申请认证
* @param param
* @return
*/
ApiResult applyAuth(ApplyAuthParam param);
}
- facade实现类
/**
* @author yanghao
* @version AuthFacade.java, v 0.1 2019-07-02 08:18
*/
@Slf4j
@Service(version = "${dubbo.version}")
public class AuthFacadeImpl implements AuthFacade {
@Autowired
private AuthService authService;
@Override
public ApiResult applyAuth(ApplyAuthParam param) {
//调用章节二里面的applyAuth接口
AuthResult result = authService.applyAuth(param.getToken, param.getIndexUrl);
return ApiResult.success(result);
}
}
注:dubbo版本号等参数自行配置一下,可参考如下:
#版本号
dubbo.version = 1.0.0
#协议
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20880
#zk地址
dubbo.registry.address = ...
#超时时间
dubbo.provider.timeout = 1000
ok,截止此时,服务端既提供了http接口,也提供了rpc接口(提醒:想调用rpc接口,客户端需要与服务端在同一个注册中心)
现在越来越多的项目使用的框架不同,所以sso的设计也在不断变化,打破了最初传统,我们要满足更多的项目, 所以我们的能力也要越强,这样才是一个好的sso服务端。
备注
- 编码临时做的,不严谨的地方请包涵,重在表达核心逻辑思想
- 本文由作者原创,转载请表明出处https://blog.csdn.net/weixin_43968234/article/details/94428151