最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Redis在微服務(wù)架構(gòu)中的幾種應(yīng)用場(chǎng)景

 更新時(shí)間:2019年05月01日 11:26:54   作者:本人禿頂程序員  
本文介紹在SpringCloud中使用Redis作為Pub/Sub異步通信、緩存或主數(shù)據(jù)庫(kù)和配置服務(wù)器的三種場(chǎng)景應(yīng)用。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

本文介紹在SpringCloud中使用Redis作為Pub/Sub異步通信、緩存或主數(shù)據(jù)庫(kù)和配置服務(wù)器的三種場(chǎng)景應(yīng)用。

Redis可以廣泛用于微服務(wù)架構(gòu)。它可能是您應(yīng)用程序以多種不同方式利用的少數(shù)流行軟件解決方案之一。根據(jù)要求,它可以充當(dāng)主數(shù)據(jù)庫(kù),緩存或消息代理。雖然它也是一個(gè)鍵/值存儲(chǔ),但我們可以將它用作微服務(wù)體系結(jié)構(gòu)中的配置服務(wù)器或發(fā)現(xiàn)服務(wù)器。雖然它通常被定義為內(nèi)存中的數(shù)據(jù)結(jié)構(gòu),但我們也可以在持久模式下運(yùn)行它。

這里我將向您展示一些使用Redis與Spring Boot和Spring Cloud框架之上構(gòu)建的微服務(wù)的示例。這些應(yīng)用程序?qū)⑹褂肦edis Pub / Sub異步通信,使用R​​edis作為緩存或主數(shù)據(jù)庫(kù),最后使用Redis作為配置服務(wù)器。

Redis作為配置服務(wù)器

如果您已經(jīng)使用Spring Cloud構(gòu)建了微服務(wù),那么您可能對(duì)Spring Cloud Config有一些經(jīng)驗(yàn)。它負(fù)責(zé)為微服務(wù)提供分布式配置模式。

不幸的是,Spring Cloud Config不支持Redis作為屬性源的后端存儲(chǔ)庫(kù)。這就是我決定分叉Spring Cloud Config項(xiàng)目并實(shí)現(xiàn)此功能的原因。

我希望我的實(shí)現(xiàn)很快將被包含在官方的Spring Cloud版本中,但是,現(xiàn)在,您可以使用我的fork repo來(lái)運(yùn)行它。我們?cè)趺从媚兀糠浅:?jiǎn)單。讓我們來(lái)看看。

Spring Boot的當(dāng)前SNAPSHOT版本2.2.0.BUILD-SNAPSHOT與我們用于Spring Cloud Config的版本相同。在構(gòu)建Spring Cloud Config Server時(shí),我們只需要包含這兩個(gè)依賴項(xiàng),如下所示。

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.2.0.BUILD-SNAPSHOT</version>
</parent>
<artifactId>config-service</artifactId>
<groupId>pl.piomin.services</groupId>
<version>1.0-SNAPSHOT</version>
<dependencies>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
    <version>2.2.0.BUILD-SNAPSHOT</version>
  </dependency>
</dependencies>

默認(rèn)情況下,Spring Cloud Config Server使用Git存儲(chǔ)庫(kù)后端。我們需要激活 redis配置文件以強(qiáng)制它使用Redis作為后端。如果您的Redis實(shí)例偵聽(tīng)的地址不是localhost:6379您需要使用spring.redis.*屬性覆蓋自動(dòng)配置的連接設(shè)置 。這是我們的bootstrap.yml文件。

spring:
 application:
  name: config-service
 profiles:
  active: redis
 redis:
  host: 192.168.99.100

應(yīng)用程序主類(lèi)應(yīng)注釋@EnableConfigServer:

@SpringBootApplication
@EnableConfigServer
public class ConfigApplication {
  public static void main(String[] args) {
    new SpringApplicationBuilder(ConfigApplication.class).run(args);
  }
}

在運(yùn)行應(yīng)用程序之前,我們需要啟動(dòng)Redis實(shí)例。這是將其作為Docker容器運(yùn)行并在端口6379上公開(kāi)的命令。

$ docker run -d --name redis -p 6379:6379 redis

每個(gè)應(yīng)用程序的配置必須在密鑰{spring.application.name}或{spring.application.name}-${spring.profiles.active[n]}。我們必須使用與配置屬性名稱(chēng)對(duì)應(yīng)的鍵創(chuàng)建哈希。

我們的示例應(yīng)用程序driver-management使用三個(gè)配置屬性:server.port用于設(shè)置HTTP偵聽(tīng)端口,spring.redis.host用于更改用作消息代理和數(shù)據(jù)庫(kù)的默認(rèn)Redis地址,以及sample.topic.name用于設(shè)置用于我們的微服務(wù)之間的異步通信的主題的名稱(chēng)。這是我們?yōu)閐river-management使用RDBTools可視化而創(chuàng)建的Redis哈希的結(jié)構(gòu)。

在Redis CLI 中運(yùn)行HGETALL ,返回:

>> HGETALL driver-management
{
  "server.port": "8100",
   "sample.topic.name": "trips",
   "spring.redis.host": "192.168.99.100"
}

在Redis中設(shè)置鍵值并使用redis配置文件運(yùn)行Spring Cloud Config Server之后,我們需要在客戶端啟用分布式配置功能。要做到這一點(diǎn),我們只需要包含對(duì)每個(gè)微服務(wù)的spring-cloud-starter-config依賴pom.xml。

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>

使用最新穩(wěn)定的Spring Cloud:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>Greenwich.SR1</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

應(yīng)用程序的名稱(chēng)是spring.application.name在啟動(dòng)時(shí)從屬性中獲取的,因此我們需要提供以下bootstrap.yml文件。

spring:
 application:
  name: driver-management

Redis作為消息代理

現(xiàn)在我們可以在基于微服務(wù)的體系結(jié)構(gòu)中繼續(xù)使用Redis的第二個(gè)用例 - 消息代理。我們將實(shí)現(xiàn)一個(gè)典型的異步系統(tǒng)。

微服務(wù)trip-management在創(chuàng)建新行程后以及完成當(dāng)前行程后向Redis Pub / Sub發(fā)送通知。通知由訂閱特定頻道的driver-management和接收 。

我們的應(yīng)用非常簡(jiǎn)單。我們只需要添加以下依賴項(xiàng),以便提供REST API并與Redis Pub / Sub集成。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

我們應(yīng)該使用頻道channel名稱(chēng)和發(fā)布者注冊(cè)bean。TripPublisher負(fù)責(zé)向目標(biāo)主題發(fā)送消息。

@Configuration
public class TripConfiguration {
  @Autowired
    RedisTemplate<?, ?> redisTemplate;
  @Bean
    TripPublisher redisPublisher() {
    return new TripPublisher(redisTemplate, topic());
  }
  @Bean
    ChannelTopic topic() {
    return new ChannelTopic("trips");
  }
}

TripPublisher使用RedisTemplate將消息發(fā)送到的話題。在發(fā)送之前,它會(huì)使用Jackson2JsonRedisSerializer對(duì)來(lái)自對(duì)象的每條消息轉(zhuǎn)換為JSON字符串。

public class TripPublisher {
  private static final Logger LOGGER = LoggerFactory.getLogger(TripPublisher.class);
  RedisTemplate<?, ?> redisTemplate;
  ChannelTopic topic;
  public TripPublisher(RedisTemplate<?, ?> redisTemplate, ChannelTopic topic) {
    this.redisTemplate = redisTemplate;
    this.redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Trip.class));
    this.topic = topic;
  }
  public void publish(Trip trip) throws JsonProcessingException {
    LOGGER.info("Sending: {}", trip);
    redisTemplate.convertAndSend(topic.getTopic(), trip);
  }
}

我們已經(jīng)在發(fā)布者方面實(shí)現(xiàn)了邏輯?,F(xiàn)在,我們可以繼續(xù)在消費(fèi)接受方面的代碼事先。

我們有兩個(gè)微服務(wù)driver-management,passenger-management,它們監(jiān)聽(tīng)trip-management微服務(wù)發(fā)送的通知 。我們需要定義RedisMessageListenerContainerbean并設(shè)置消息監(jiān)聽(tīng)器實(shí)現(xiàn)類(lèi)。

@Configuration
public class DriverConfiguration {
  @Autowired
    RedisConnectionFactory redisConnectionFactory;
  @Bean
    RedisMessageListenerContainer container() {
    RedisMessageListenerContainer container = new RedisMessageListenerContainer();
    container.addMessageListener(messageListener(), topic());
    container.setConnectionFactory(redisConnectionFactory);
    return container;
  }
  @Bean
    MessageListenerAdapter messageListener() {
    return new MessageListenerAdapter(new DriverSubscriber());
  }
  @Bean
    ChannelTopic topic() {
    return new ChannelTopic("trips");
  }
}

負(fù)責(zé)處理傳入通知的類(lèi)需要實(shí)現(xiàn)該 MessageListener接口。收到消息后, DriverSubscriber將其從JSON反序列化到對(duì)象并更改驅(qū)動(dòng)程序的狀態(tài)。

@Service
public class DriverSubscriber implements MessageListener {
  private final Logger LOGGER = LoggerFactory.getLogger(DriverSubscriber.class);
  @Autowired
    DriverRepository repository;
  ObjectMapper mapper = new ObjectMapper();
  @Override
    public void onMessage(Message message, byte[] bytes) {
    try {
      Trip trip = mapper.readValue(message.getBody(), Trip.class);
      LOGGER.info("Message received: {}", trip.toString());
      Optional<Driver> optDriver = repository.findById(trip.getDriverId());
      if (optDriver.isPresent()) {
        Driver driver = optDriver.get();
        if (trip.getStatus() == TripStatus.DONE)
                  driver.setStatus(DriverStatus.WAITING); else
                  driver.setStatus(DriverStatus.BUSY);
        repository.save(driver);
      }
    }
    catch (IOException e) {
      LOGGER.error("Error reading message", e);
    }
  }
}

Redis作為主數(shù)據(jù)庫(kù)

雖然使用Redis的主要目的是內(nèi)存中緩存或作為鍵/值存儲(chǔ),但它也可以充當(dāng)應(yīng)用程序的主數(shù)據(jù)庫(kù)。在這種情況下,以持久模式運(yùn)行Redis是值得的。

$ docker run -d --name redis -p 6379:6379 redis redis-server --appendonly yes

實(shí)體使用哈希散列操作和mmap結(jié)構(gòu)存儲(chǔ)在Redis中。每個(gè)實(shí)體都需要一個(gè)哈希鍵和id。

@RedisHash("driver")
public class Driver {
  @Id
    private long id;
  private String name;
  @GeoIndexed
    private Point location;
  private DriverStatus status;
  // setters and getters ...
}

幸運(yùn)的是,Spring Data Redis為Redis集成提供了一個(gè)眾所周知的存儲(chǔ)庫(kù)模式。要啟用它,我們應(yīng)該使用@EnableRedisRepositories注釋配置類(lèi)或主類(lèi)。使用Spring存儲(chǔ)庫(kù)模式時(shí),我們不必自己構(gòu)建對(duì)Redis的任何查詢。

@Configuration
@EnableRedisRepositories
public class DriverConfiguration {
  // logic ...
}

使用Spring Data存儲(chǔ)庫(kù),我們不必構(gòu)建任何Redis查詢,只需遵循Spring Data的約定下的名稱(chēng)方法。為了我們的示例目的,我們可以使用Spring Data中實(shí)現(xiàn)的默認(rèn)方法。這是存儲(chǔ)庫(kù)接口的聲明driver-management。

public interface DriverRepository extends CrudRepository<Driver, Long> {}

不要忘記通過(guò)使用@EnableRedisRepositories注釋主應(yīng)用程序類(lèi)或配置類(lèi)來(lái)啟用Spring Data存儲(chǔ)庫(kù)。

@Configuration
@EnableRedisRepositories
public class DriverConfiguration {
  ...
}

結(jié)論

正如我在前言中提到的,Redis在微服務(wù)架構(gòu)中有各種用例。我剛剛介紹了如何與Spring Cloud和Spring Data一起使用它來(lái)提供配置服務(wù)器,消息代理和數(shù)據(jù)庫(kù)。Redis通常被認(rèn)為是緩存存儲(chǔ),但我希望在閱讀本文之后,您將改變主意。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Tomcat中session的管理機(jī)制

    Tomcat中session的管理機(jī)制

    這篇文章主要為大家詳細(xì)介紹了Tomcat中session的管理機(jī)制 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 最新版IDEA配置 Tomcat的詳細(xì)過(guò)程

    最新版IDEA配置 Tomcat的詳細(xì)過(guò)程

    本文介紹如何在IDEA中配置Tomcat服務(wù)器,并創(chuàng)建Web項(xiàng)目,首先檢查T(mén)omcat是否安裝完成,然后在IDEA中創(chuàng)建Web項(xiàng)目并添加Web結(jié)構(gòu),接著,配置編譯輸出路徑和依賴,將Tomcat的jar包復(fù)制到項(xiàng)目中,最后,配置Tomcat服務(wù)器并運(yùn)行項(xiàng)目,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-01-01
  • Java生成由時(shí)間組成的訂單號(hào)方式

    Java生成由時(shí)間組成的訂單號(hào)方式

    這篇文章主要介紹了Java生成由時(shí)間組成的訂單號(hào)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 盤(pán)點(diǎn)MQ中的異常測(cè)試

    盤(pán)點(diǎn)MQ中的異常測(cè)試

    這篇文章主要為大家介紹了盤(pán)點(diǎn)MQ中的異常測(cè)試,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Resttemplate中設(shè)置超時(shí)時(shí)長(zhǎng)方式

    Resttemplate中設(shè)置超時(shí)時(shí)長(zhǎng)方式

    這篇文章主要介紹了Resttemplate中設(shè)置超時(shí)時(shí)長(zhǎng)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringBoot中的YAML配置文件和日志詳解

    SpringBoot中的YAML配置文件和日志詳解

    這篇文章主要介紹了SpringBoot中的YAML配置文件和日志的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-12-12
  • Java訂單30分鐘未支付自動(dòng)取消該怎么實(shí)現(xiàn)

    Java訂單30分鐘未支付自動(dòng)取消該怎么實(shí)現(xiàn)

    在開(kāi)發(fā)中往往會(huì)遇到一些關(guān)于延時(shí)任務(wù)的需求,例如生成訂單30分鐘未支付,則自動(dòng)取消,下面這篇文章主要給大家介紹了關(guān)于Java訂單30分鐘未支付自動(dòng)取消該怎么實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • SpringBoot+Vue項(xiàng)目部署實(shí)現(xiàn)傳統(tǒng)方式

    SpringBoot+Vue項(xiàng)目部署實(shí)現(xiàn)傳統(tǒng)方式

    我們?cè)谶M(jìn)行前后端分離開(kāi)發(fā)的時(shí)候,一般是將前端項(xiàng)目部署到nginx服務(wù)器上,與后端項(xiàng)目分開(kāi)部署,這篇文章主要給大家介紹了關(guān)于SpringBoot+Vue項(xiàng)目部署實(shí)現(xiàn)傳統(tǒng)方式的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • netty中pipeline異常事件分析

    netty中pipeline異常事件分析

    這篇文章主要為大家介紹了netty中pipeline異常事件分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • MyBatis的JdbcType與Oracle、MySql數(shù)據(jù)類(lèi)型一覽表

    MyBatis的JdbcType與Oracle、MySql數(shù)據(jù)類(lèi)型一覽表

    這篇文章主要介紹了MyBatis的JdbcType與Oracle、MySql數(shù)據(jù)類(lèi)型一覽表,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評(píng)論

山东省| 金华市| 章丘市| 洛南县| 贺州市| 洛南县| 宜州市| 桦川县| 北流市| 仙游县| 永宁县| 馆陶县| 卓尼县| 永安市| 德钦县| 乐东| 连江县| 师宗县| 舒兰市| 巴林右旗| 绥芬河市| 宜君县| 泸西县| 宝应县| 太仆寺旗| 甘孜| 连南| 武川县| 通许县| 赞皇县| 石阡县| 肇源县| 新民市| 宣武区| 揭西县| 海原县| 宁武县| 衡山县| 额尔古纳市| 综艺| 马龙县|