A Microservice Architecture with Spring Boot and Spring Cloud(四)

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;    
    } 
}

猜你喜欢

转载自blog.csdn.net/qq_24091555/article/details/78588075