1. 程式人生 > >A Microservice Architecture with Spring Boot and Spring Cloud(四)

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