完整微服务化示例:使用 Apache ServiceComb 进行微服务开发、容器化、弹性伸缩 (四)

发布于:2019 年 12 月 25 日 18:10

完整微服务化示例:使用 Apache ServiceComb 进行微服务开发、容器化、弹性伸缩(四)

门卫 (Doorman)

门卫为公司提供安全保障,屏蔽非合法用户,防止其骗取免费服务,甚至伤害技工和养蜂人。

门卫认证服务

认证功能我们采用 JSON Web Token (JWT)( https://jwt.io/introduction/ ) 的机制,具体实现超出了这篇文章的范围, 细节大家可以查看 github 上 workshop 的 doorman( https://github.com/huaweicse/ServiceComb-Company-WorkShop ) 模块代码。

认证服务的接口如下,authenticate 方法根据用户名和密码查询确认用户存在,并返回对应 JWT token。用户登录后的每次 请求都需要带上返回的 JWT token,而 validate 方法将验证 token 以确认其有效。

复制代码
public interface AuthenticationService {
String authenticate(String username, String password);
String validate(String token);
}

门卫认证服务端点

与前两节的 Rest 服务端点相似,我们加上 @RestSchema 注释,以便 ServiceComb 自动配置端点、生成契约并注册服务。

复制代码
@RestSchema(schemaId = "authenticationRestEndpoint")
@Controller
@RequestMapping("/rest")
public class AuthenticationController {
private static final Logger logger = LoggerFactory.getLogger(AuthenticationController.class);
static final String USERNAME = "username";
static final String PASSWORD = "password";
static final String TOKEN = "token";
private final AuthenticationService authenticationService;
@Autowired
AuthenticationController(AuthenticationService authenticationService) {
this.authenticationService = authenticationService;
}
@RequestMapping(value = "/login", method = POST, produces = TEXT_PLAIN_VALUE)
public ResponseEntity<String> login(
@RequestParam(USERNAME) String username,
@RequestParam(PASSWORD) String password) {
logger.info("Received login request from user {}", username);
String token = authenticationService.authenticate(username, password);
HttpHeaders headers = new HttpHeaders();
headers.add(AUTHORIZATION, TOKEN_PREFIX + token);
logger.info("Authenticated user {} successfully", username);
return new ResponseEntity<>("Welcome, " + username, headers, OK);
}
@RequestMapping(value = "/validate", method = POST, consumes = APPLICATION_JSON_UTF8_VALUE, produces = TEXT_PLAIN_VALUE)
@ResponseBody
public String validate(@RequestBody Token token) {
logger.info("Received validation request of token {}", token);
return authenticationService.validate(token.getToken());
}
}
class Token {
private String token;
Token() {
}
Token(String token) {
this.token = token;
}
public String getToken() {
return token;
}
@Override
public String toString() {
return "Token{" +
"token='" + token + '\'' +
'}';
}
}

同样,我们需要提供服务应用启动入口以及 microservice.yaml:

复制代码
@SpringBootApplication
@EnableServiceComb
public class DoormanApplication {
public static void main(String[] args) {
SpringApplication.run(DoormanApplication.class, args);
}
}
# all interconnected microservices must belong to an application wth the same ID
APPLICATION_ID: company
service_description:
# name of the declaring microservice
name: doorman
version: 0.0.1
cse:
service:
registry:
address: http://sc.servicecomb.io:30100
rest:
address: 0.0.0.0:9090

经理 (Manager)

为了管理所有人员和设施,经理作为用户唯一接口人,主要功能有:

  • 联系门卫认证用户,保护技工和养蜂人,以免非法用户骗取服务并逃避服务费用

  • 联系能力相符的技工和养蜂人,平衡工作量,避免单个人员工作超载

  • 管理项目归档,避免重复工作,保证公司收益最大化

由于经理责任重大,我们选取了业界有名的 Netflix Zuul( https://github.com/Netflix/zuul ) 作为候选人并加以培训, 提升其能力,以保证其能胜任该职位。

首先我们引入依赖:

复制代码
<dependency>
<groupId>org.apache.servicecomb</groupId>
<artifactId>spring-boot-starter-discovery</artifactId>
</dependency>

本文转载自微服务蜂巢公众号。

原文链接: https://mp.weixin.qq.com/s?__biz=MzUxNTEwNTg5Mg==&mid=2247488670&idx=1&sn=7556990599cea8e0fd80ed54b9f39026&chksm=f9bae195cecd688332940d0b296909e8130d828104c36c20f49d76d43561f626eae24bd0c1ef&scene=0&xtrack=1&key=17fbc717c1803f309d535a4bdbc0f9c0d8d2089a5c7e455df8c0a5e6d824a6534b8476d2ad151cd45ed10eb7a15577914596444e867d96f615c277fc05fe951cef48de8b7d0732dcb4bc74f5c0e2f95a&ascene=14&uin=MTI5MjAyNjcyMQ%3D%3D&devicetype=Windows+10&version=62070158&lang=zh_CN&exportkey=AfH3CzqE%2F1ENttvg815y9Uo%3D&pass_ticket=oGcazNeaRfkuszcDU0L7jpfeTFZ3%2FULBAbPnhurUkiyW7DLvBVsoC%2Fh5OWX1zIsH

阅读数:26 发布于:2019 年 12 月 25 日 18:10

评论

发布
暂无评论