Skip to content

Commit 5b6c524

Browse files
committed
Kafka
1 parent 16bb00c commit 5b6c524

File tree

116 files changed

+846
-256
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

116 files changed

+846
-256
lines changed

README.md

+21-4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
- [Postgres](https://www.postgresql.org/about/)
1313
- [React](https://ru.reactjs.org/docs/getting-started.html)
1414
- [GraphQL](https://graphql.org/)
15+
- [Apache Kafka](https://developer.confluent.io/quickstart/kafka-docker/)
1516
- [Thymeleaf](https://www.thymeleaf.org/)
1617
- [Jakarta Bean Validation](https://beanvalidation.org/)
1718
- [Jakarta JAXB](https://eclipse-ee4j.github.io/jaxb-ri/)
@@ -51,19 +52,22 @@ Dmitriis-MacBook-Pro ~ % docker -v
5152
Docker version 20.10.14, build a224086
5253
```
5354

54-
#### 2. Спуллить контейнер postgres версии 15.1
55+
#### 2. Спуллить контейнер postgres:15.1, zookeeper и kafka версии 7.3.2
5556

5657
```posh
5758
docker pull postgres:15.1
59+
docker pull confluentinc/cp-zookeeper:7.3.2
60+
docker pull confluentinc/cp-kafka:7.3.2
5861
```
5962

6063
После `pull` вы увидите спуленный image командой `docker images`
6164

6265
```posh
6366
mitriis-MacBook-Pro ~ % docker images
64-
REPOSITORY TAG IMAGE ID CREATED SIZE
65-
postgres 15.1 9f3ec01f884d 10 days ago 379MB
66-
postgres latest 9f3ec01f884d 10 days ago 379MB
67+
REPOSITORY TAG IMAGE ID CREATED SIZE
68+
postgres 15.1 9f3ec01f884d 10 days ago 379MB
69+
confluentinc/cp-kafka 7.3.2 db97697f6e28 12 months ago 457MB
70+
confluentinc/cp-zookeeper 7.3.2 6fe5551964f5 7 years ago 451MB
6771
```
6872

6973
#### 3. Создать volume для сохранения данных из БД в docker на вашем компьютере
@@ -76,6 +80,19 @@ docker volume create pgdata
7680

7781
```posh
7882
docker run --name niffler-all -p 5432:5432 -e POSTGRES_PASSWORD=secret -v pgdata:/var/lib/postgresql/data -d postgres:15.1
83+
84+
docker run --name=zookeeper -e ZOOKEEPER_CLIENT_PORT=2181 -e ZOOKEEPER_TICK_TIME=2000 -p 2181:2181 -d confluentinc/cp-zookeeper:7.3.2
85+
86+
Zookeeper_Server_IP=$(docker inspect zookeeper --format='{{ .NetworkSettings.IPAddress }}')
87+
88+
docker run --name=kafka -e KAFKA_BROKER_ID=1 \
89+
-e KAFKA_ZOOKEEPER_CONNECT=${Zookeeper_Server_IP}:2181 \
90+
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \
91+
-e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \
92+
-e KAFKA_TRANSACTION_STATE_LOG_MIN_ISR=1 \
93+
-e KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=1 \
94+
-p 9092:9092 -d confluentinc/cp-kafka:7.3.2
95+
7996
```
8097

8198
#### 5. Установить одну из программ для визуальной работы с Postgres

docker-compose.test.yml

+35
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,37 @@ services:
2525
- test-network
2626
dns_search: .
2727

28+
zookeeper:
29+
container_name: zookeeper
30+
image: confluentinc/cp-zookeeper:7.3.2
31+
expose:
32+
- "2181"
33+
environment:
34+
- ZOOKEEPER_CLIENT_PORT=2181
35+
- ZOOKEEPER_TICK_TIME=2000
36+
networks:
37+
- test-network
38+
dns_search: .
39+
40+
kafka:
41+
container_name: kafka
42+
image: confluentinc/cp-kafka:7.3.2
43+
expose:
44+
- "9092"
45+
depends_on:
46+
zookeeper:
47+
condition: service_started
48+
environment:
49+
- KAFKA_BROKER_ID=1
50+
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
51+
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092
52+
- KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1
53+
- KAFKA_TRANSACTION_STATE_LOG_MIN_ISR=1
54+
- KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=1
55+
networks:
56+
- test-network
57+
dns_search: .
58+
2859
auth.niffler.dc:
2960
container_name: auth.niffler.dc
3061
image: dtuchs/niffler-auth:latest
@@ -38,6 +69,8 @@ services:
3869
depends_on:
3970
niffler-all-db:
4071
condition: service_healthy
72+
kafka:
73+
condition: service_started
4174
networks:
4275
- test-network
4376
dns_search: .
@@ -87,6 +120,8 @@ services:
87120
depends_on:
88121
niffler-all-db:
89122
condition: service_healthy
123+
kafka:
124+
condition: service_started
90125
networks:
91126
- test-network
92127
dns_search: .

docker-compose.yml

+33
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,35 @@ services:
2121
- niffler-network
2222
dns_search: .
2323

24+
zookeeper:
25+
container_name: zookeeper
26+
image: confluentinc/cp-zookeeper:7.3.2
27+
expose:
28+
- "2181"
29+
environment:
30+
- ZOOKEEPER_CLIENT_PORT=2181
31+
- ZOOKEEPER_TICK_TIME=2000
32+
networks:
33+
- niffler-network
34+
35+
kafka:
36+
container_name: kafka
37+
image: confluentinc/cp-kafka:7.3.2
38+
expose:
39+
- "9092"
40+
depends_on:
41+
zookeeper:
42+
condition: service_started
43+
environment:
44+
- KAFKA_BROKER_ID=1
45+
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
46+
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092
47+
- KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1
48+
- KAFKA_TRANSACTION_STATE_LOG_MIN_ISR=1
49+
- KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=1
50+
networks:
51+
- niffler-network
52+
2453
auth.niffler.dc:
2554
container_name: auth.niffler.dc
2655
image: dtuchs/niffler-auth:latest
@@ -35,6 +64,8 @@ services:
3564
depends_on:
3665
niffler-all-db:
3766
condition: service_healthy
67+
kafka:
68+
condition: service_started
3869
networks:
3970
- niffler-network
4071
dns_search: .
@@ -92,6 +123,8 @@ services:
92123
depends_on:
93124
niffler-all-db:
94125
condition: service_healthy
126+
kafka:
127+
condition: service_started
95128
networks:
96129
- niffler-network
97130
dns_search: .

niffler-auth/build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ dependencies {
2020
implementation "org.springframework.boot:spring-boot-starter-validation"
2121
implementation "org.springframework.boot:spring-boot-starter-actuator"
2222
implementation 'org.springframework.security:spring-security-oauth2-authorization-server:1.0.0'
23+
implementation 'org.springframework.kafka:spring-kafka:3.0.7'
2324
runtimeOnly 'org.postgresql:postgresql'
2425
testImplementation 'org.springframework.boot:spring-boot-starter-test'
2526
}

niffler-auth/src/main/java/guru/qa/nifflerauth/NifflerAuthApplication.java niffler-auth/src/main/java/guru/qa/niffler/NifflerAuthApplication.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package guru.qa.nifflerauth;
1+
package guru.qa.niffler;
22

33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package guru.qa.niffler.config;
2+
3+
import guru.qa.niffler.model.UserJson;
4+
import org.apache.kafka.clients.admin.NewTopic;
5+
import org.apache.kafka.common.serialization.StringSerializer;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.boot.autoconfigure.kafka.KafkaProperties;
8+
import org.springframework.context.annotation.Bean;
9+
import org.springframework.context.annotation.Configuration;
10+
import org.springframework.context.annotation.Primary;
11+
import org.springframework.kafka.config.TopicBuilder;
12+
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
13+
import org.springframework.kafka.core.KafkaTemplate;
14+
import org.springframework.kafka.core.ProducerFactory;
15+
import org.springframework.kafka.support.serializer.JsonSerializer;
16+
17+
import java.util.HashMap;
18+
import java.util.Map;
19+
20+
import static org.apache.kafka.clients.producer.ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG;
21+
import static org.apache.kafka.clients.producer.ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG;
22+
23+
@Configuration
24+
public class NifflerAuthProducerConfiguration {
25+
26+
private final KafkaProperties kafkaProperties;
27+
28+
@Autowired
29+
public NifflerAuthProducerConfiguration(KafkaProperties kafkaProperties) {
30+
this.kafkaProperties = kafkaProperties;
31+
}
32+
33+
@Bean
34+
public Map<String, Object> producerConfiguration() {
35+
Map<String, Object> properties = new HashMap<>(kafkaProperties.buildProducerProperties());
36+
properties.put(KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
37+
properties.put(VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
38+
return properties;
39+
}
40+
41+
@Bean
42+
public ProducerFactory<String, UserJson> producerFactory() {
43+
return new DefaultKafkaProducerFactory<>(producerConfiguration());
44+
}
45+
46+
@Bean
47+
public KafkaTemplate<String, UserJson> kafkaTemplate() {
48+
return new KafkaTemplate<>(producerFactory());
49+
}
50+
51+
@Bean
52+
@Primary
53+
public NewTopic topic() {
54+
return TopicBuilder.name("users")
55+
.partitions(1)
56+
.replicas(1)
57+
.build();
58+
}
59+
}

niffler-auth/src/main/java/guru/qa/nifflerauth/config/NifflerAuthServiceConfig.java niffler-auth/src/main/java/guru/qa/niffler/config/NifflerAuthServiceConfig.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
package guru.qa.nifflerauth.config;
1+
package guru.qa.niffler.config;
22

33
import com.nimbusds.jose.jwk.JWKSet;
44
import com.nimbusds.jose.jwk.source.JWKSource;
55
import com.nimbusds.jose.proc.SecurityContext;
6-
import guru.qa.nifflerauth.config.keys.KeyManager;
7-
import guru.qa.nifflerauth.service.cors.CorsCustomizer;
6+
import guru.qa.niffler.config.keys.KeyManager;
7+
import guru.qa.niffler.service.cors.CorsCustomizer;
88
import org.springframework.beans.factory.annotation.Autowired;
99
import org.springframework.beans.factory.annotation.Value;
1010
import org.springframework.context.annotation.Bean;

niffler-auth/src/main/java/guru/qa/nifflerauth/config/SecurityConfig.java niffler-auth/src/main/java/guru/qa/niffler/config/SecurityConfig.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
package guru.qa.nifflerauth.config;
1+
package guru.qa.niffler.config;
22

3-
import guru.qa.nifflerauth.service.cors.CookieCsrfFilter;
4-
import guru.qa.nifflerauth.service.cors.CorsCustomizer;
3+
import guru.qa.niffler.service.cors.CookieCsrfFilter;
4+
import guru.qa.niffler.service.cors.CorsCustomizer;
55
import org.springframework.beans.factory.annotation.Autowired;
66
import org.springframework.context.annotation.Bean;
77
import org.springframework.context.annotation.Configuration;

niffler-auth/src/main/java/guru/qa/nifflerauth/config/keys/KeyManager.java niffler-auth/src/main/java/guru/qa/niffler/config/keys/KeyManager.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package guru.qa.nifflerauth.config.keys;
1+
package guru.qa.niffler.config.keys;
22

33
import com.nimbusds.jose.jwk.RSAKey;
44
import jakarta.annotation.Nonnull;

niffler-auth/src/main/java/guru/qa/nifflerauth/controller/LoginController.java niffler-auth/src/main/java/guru/qa/niffler/controller/LoginController.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package guru.qa.nifflerauth.controller;
1+
package guru.qa.niffler.controller;
22

33
import org.springframework.stereotype.Controller;
44
import org.springframework.web.bind.annotation.GetMapping;

niffler-auth/src/main/java/guru/qa/nifflerauth/controller/RegisterController.java niffler-auth/src/main/java/guru/qa/niffler/controller/RegisterController.java

+12-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
package guru.qa.nifflerauth.controller;
1+
package guru.qa.niffler.controller;
22

3-
import guru.qa.nifflerauth.model.RegistrationModel;
4-
import guru.qa.nifflerauth.service.UserService;
3+
import guru.qa.niffler.model.RegistrationModel;
4+
import guru.qa.niffler.model.UserJson;
5+
import guru.qa.niffler.service.UserService;
56
import jakarta.annotation.Nonnull;
67
import jakarta.servlet.http.HttpServletResponse;
78
import jakarta.validation.Valid;
@@ -10,6 +11,7 @@
1011
import org.springframework.beans.factory.annotation.Autowired;
1112
import org.springframework.beans.factory.annotation.Value;
1213
import org.springframework.dao.DataIntegrityViolationException;
14+
import org.springframework.kafka.core.KafkaTemplate;
1315
import org.springframework.stereotype.Controller;
1416
import org.springframework.ui.Model;
1517
import org.springframework.validation.BeanPropertyBindingResult;
@@ -32,12 +34,14 @@ public class RegisterController {
3234

3335
private final UserService userService;
3436
private final String nifflerFrontUri;
37+
private final KafkaTemplate kafkaTemplate;
3538

3639
@Autowired
3740
public RegisterController(UserService userService,
38-
@Value("${niffler-front.base-uri}") String nifflerFrontUri) {
41+
@Value("${niffler-front.base-uri}") String nifflerFrontUri, KafkaTemplate kafkaTemplate) {
3942
this.userService = userService;
4043
this.nifflerFrontUri = nifflerFrontUri;
44+
this.kafkaTemplate = kafkaTemplate;
4145
}
4246

4347
@GetMapping("/register")
@@ -59,6 +63,10 @@ public String registerUser(@Valid @ModelAttribute RegistrationModel registration
5963
registrationModel.getUsername(),
6064
registrationModel.getPassword()
6165
);
66+
UserJson kafkaMsg = new UserJson();
67+
kafkaMsg.setUsername(registeredUserName);
68+
kafkaTemplate.send("users", kafkaMsg);
69+
6270
response.setStatus(HttpServletResponse.SC_CREATED);
6371
model.addAttribute(MODEL_USERNAME_ATTR, registeredUserName);
6472
} catch (DataIntegrityViolationException e) {

niffler-auth/src/main/java/guru/qa/nifflerauth/data/Authority.java niffler-auth/src/main/java/guru/qa/niffler/data/Authority.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package guru.qa.nifflerauth.data;
1+
package guru.qa.niffler.data;
22

33
public enum Authority {
44
read, write

niffler-auth/src/main/java/guru/qa/nifflerauth/data/AuthorityEntity.java niffler-auth/src/main/java/guru/qa/niffler/data/AuthorityEntity.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package guru.qa.nifflerauth.data;
1+
package guru.qa.niffler.data;
22

33
import jakarta.persistence.Column;
44
import jakarta.persistence.Entity;

niffler-spend/src/main/java/niffler/model/CurrencyValues.java niffler-auth/src/main/java/guru/qa/niffler/data/CurrencyValues.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package niffler.model;
1+
package guru.qa.niffler.data;
22

33
public enum CurrencyValues {
44
RUB, USD, EUR, KZT

niffler-auth/src/main/java/guru/qa/nifflerauth/data/UserEntity.java niffler-auth/src/main/java/guru/qa/niffler/data/UserEntity.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package guru.qa.nifflerauth.data;
1+
package guru.qa.niffler.data;
22

33
import jakarta.persistence.CascadeType;
44
import jakarta.persistence.Column;

niffler-auth/src/main/java/guru/qa/nifflerauth/data/repository/UserRepository.java niffler-auth/src/main/java/guru/qa/niffler/data/repository/UserRepository.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
package guru.qa.nifflerauth.data.repository;
1+
package guru.qa.niffler.data.repository;
22

3-
import guru.qa.nifflerauth.data.UserEntity;
3+
import guru.qa.niffler.data.UserEntity;
44
import jakarta.annotation.Nonnull;
55
import jakarta.annotation.Nullable;
66
import org.springframework.data.jpa.repository.JpaRepository;

niffler-auth/src/main/java/guru/qa/nifflerauth/domain/NifflerUserPrincipal.java niffler-auth/src/main/java/guru/qa/niffler/domain/NifflerUserPrincipal.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
package guru.qa.nifflerauth.domain;
1+
package guru.qa.niffler.domain;
22

3-
import guru.qa.nifflerauth.data.UserEntity;
3+
import guru.qa.niffler.data.UserEntity;
44
import org.springframework.security.core.GrantedAuthority;
55
import org.springframework.security.core.authority.SimpleGrantedAuthority;
66
import org.springframework.security.core.userdetails.UserDetails;

niffler-auth/src/main/java/guru/qa/nifflerauth/model/EqualPasswords.java niffler-auth/src/main/java/guru/qa/niffler/model/EqualPasswords.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
package guru.qa.nifflerauth.model;
1+
package guru.qa.niffler.model;
22

3-
import guru.qa.nifflerauth.service.EqualPasswordsValidator;
3+
import guru.qa.niffler.service.EqualPasswordsValidator;
44
import jakarta.validation.Constraint;
55
import jakarta.validation.Payload;
66

niffler-auth/src/main/java/guru/qa/nifflerauth/model/RegistrationModel.java niffler-auth/src/main/java/guru/qa/niffler/model/RegistrationModel.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package guru.qa.nifflerauth.model;
1+
package guru.qa.niffler.model;
22

33
import jakarta.validation.constraints.NotEmpty;
44
import jakarta.validation.constraints.NotNull;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package guru.qa.niffler.model;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
5+
public class UserJson {
6+
@JsonProperty("username")
7+
private String username;
8+
9+
public String getUsername() {
10+
return username;
11+
}
12+
13+
public void setUsername(String username) {
14+
this.username = username;
15+
}
16+
}

0 commit comments

Comments
 (0)