A Microservice Architecture with Spring Boot and Spring Cloud(四)
阿新 • • 發佈:2018-12-17
REST APIs
我們需要兩個相同設定的API:Config Client,Eureka,JPA,Web,和Security:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId >
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId >
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
我們在兩個API上加上註解@EnableEurekaClient:
@SpringBootApplication
@EnableEurekaClient
public class ServiceApplication {... }
這是我們的第一個資源服務“Book Service”屬性配置。book-service.properties將在應用程式配置庫中。
spring.application.name=book-service
server.port=8083
eureka.client.region=default
eureka.client.registryFetchIntervalSeconds=5
management.security.sessions=never
這裡是Book Service bootstrap.properties,它將在我們的Book Service資原始檔夾中。
spring.cloud.config.name=book-service
spring.cloud.config.discovery.service-id=config
spring.cloud.config.discovery.enabled=true
spring.cloud.config.username=configUser
spring.cloud.config.password=configPassword
eureka.client.serviceUrl.defaultZone=http://discUser:[email protected]:8082/eureka/
同樣,這是我們的第二項服務“Book Service” - rating-service.properties:
spring.application.name=rating-service
server.port=8084 eureka.client.region=default
eureka.client.registryFetchIntervalSeconds=5
management.security.sessions=never
還有boostrap.properties
spring.cloud.config.name=rating-service
spring.cloud.config.discovery.service-id=config
spring.cloud.config.discovery.enabled=true
spring.cloud.config.username=configUser
spring.cloud.config.password=configPassword
eureka.client.serviceUrl.defaultZone=http://discUser:[email protected]:8082/eureka/
Session 配置
我們需要使用Spring Session在系統中的不同服務之間共享會話。 共享會話允許在我們的閘道器服務中記錄使用者並將該身份驗證傳播到其他服務。
首先,我們需要將以下依賴項新增到Discovery伺服器,閘道器伺服器,Book Service和Book Service:
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
我們需要將會話配置新增到Discovery伺服器和REST API:
@EnableRedisHttpSession
public class SessionConfig extends AbstractHttpSessionApplicationInitializer { }
對於我們的閘道器伺服器,它會點有不同:
@Configuration
@EnableRedisHttpSession(redisFlushMode = RedisFlushMode.IMMEDIATE)
public class SessionConfig extends AbstractHttpSessionApplicationInitializer { }
我們還為閘道器伺服器添加了一個簡單的過濾器來轉發會話,以便在登入後身份驗證將傳播到另一個服務:
@Component
public class SessionSavingZuulPreFilter extends ZuulFilter {
@Autowired
private SessionRepository repository;
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext context = RequestContext.getCurrentContext();
HttpSession httpSession = context.getRequest().getSession();
Session session = repository.getSession(httpSession.getId());
context.addZuulRequestHeader( "Cookie", "SESSION=" + httpSession.getId());
return null;
}
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
}