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:discPassword@localhost: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:discPassword@localhost: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;
}
}