作业07:微服务
作业7 微服务
选题:开发一个微服务,输入为书名,输出为书的作者。将此微服务单独部署,并使用netflix-zuul 或其他你擅长使用的工具进行路由,在你的E-Book 系统中使用该服务来完成作者搜索功能。请你编写文档,用你编写的这个微服务为例,解释Gateway 和Service Registry 在微服务架构中都起到了什么作用?在文档中还需要说明你的服务的部署与使用方式。
一、回答问题
Gateway的作用:GateWay起到请求分流的作用,相当于所有服务的门户,将客户端请求与服务端应用相分离,客户端请求到达gateway后,gateway会根据请求的URL判断,然后根据判断的结果(比如以某个特定字符开头的URL)转发到对应的处理相关服务的地址。
Service Registry的作用:相当于一个注册表,当一个微服务的服务器启动的时候(包括GateWay),他会到Service Registry这个注册表上注册自己的服务,这样Gateway在面对客户端请求到来的时候,就会根据这个注册表来把请求转发给相关的微服务的服务器。
如下图所示:Service Registry可以看到注册的相关的服务的名称。
微服务的部署方式:如下图,为了方便演示,我配置了相关模块的启动配置。其中微服务涉及到的包括:Eureka模块(相当于上面所说的注册表,Service Registry);GateWay(就是下面的GateWay),MicroService(处理这个搜索作者的功能的微服务),当然剩下的一个是我的原来是的后端。
在实际的部署中:
- 首先需要启动注册表服务器,因为其他的服务器启动的时候都要到服务注册这里来注册一下,所以必须要最先启动Eureka的这个服务。
- 然后启动微服务具体的服务器(就是我那个处理搜索的服务的),在这个服务器启动的时候会自动到注册表服务器里面注册一下,便于后面的GateWay能够找得到。
- 最后启动GateWay,因为具体的业务服务器已经启动了,启动GateWay之后,用户的请求就可以转发到对应的微服务,如果先启动GateWay而没有启动具体的业务服务器,如果有请求发来就会导致GateWay找不到对应的微服务的服务器,然后出现报错。
二、截图
微服务的效果:
这个是数据库的图,和上面的是一致的。
三、代码
(一)处理搜索的微服务
由于这个服务非常的简单,就不做特别复杂的分层。代码的原理就是搜索书的名称,然后返回作者信息。
(二)GateWay的代码
由于我所有微服务的URL都是以/microservice
开头的,所以通过下面的代码可以识别出,然后转发给对应的服务处理端。
package com.zzq.ebook.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@EnableDiscoveryClient
@EnableEurekaClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
@Bean
public RouteLocator myRoutes(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r.path("/microservice/**")
.filters(f -> f.rewritePath("/microservice",""))
.uri("lb://BOOK-SERVICE")
)
.build();
}
}
三、Eureka
下面是配置信息,配置端口,服务发现的地址:
server:
port:
8040
spring:
application:
name: Eureka
eureka:
instance:
prefer-ip-address: true
client:
fetch-registry: false
register-with-eureka: false
serviceUrl:
defaultZone: http://localhost:8040/eureka
主类也非常的简单,如下就可以运行。
package com.zzq.ebook.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}