Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Microservice communication/rest template #10

Merged
merged 2 commits into from
Aug 12, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions d-gateway/src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@ spring:
uri: lb://ORDER-SERVICE
predicates:
- Path=/order-service/**
filters:
- RemoveRequestHeader=Cookie
- RewritePath=/order-service/(?<segment>.*), /$\{segment}

default-filters:
- name : GlobalFilter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

@RequiredArgsConstructor
@RestController
@RequestMapping("/order-service")
@RequestMapping("/")
public class OrderController {

private final OrderService orderService;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,15 @@

import org.modelmapper.ModelMapper;
import org.modelmapper.convention.MatchingStrategies;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.security.web.FilterChainProxy;

import javax.servlet.FilterChain;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
@EnableDiscoveryClient //유레카 클라이언트로 추가
public class UserServiceApplication {

public static void main(String[] args) {
Expand All @@ -31,4 +25,11 @@ public ModelMapper modelMapper() {
}


@Bean
@LoadBalanced //url 주소 service이름으로 대체 시켜주는 어노테이션
public RestTemplate restTemplate() {
return new RestTemplate();
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,9 @@ public ResponseEntity<ResponseUser> createUser(@RequestBody @Valid RequestUser r
public ResponseEntity findUsers() {
return ResponseEntity.status(HttpStatus.ACCEPTED).body(userService.findUserByAll());
}



//유저정보와 오더정보를 한번에 가져오기 (order : restTemplate 호출)
@GetMapping("/users/{userId}")
public ResponseEntity findUserByUserId(@PathVariable String userId) {
return ResponseEntity.status(HttpStatus.ACCEPTED).body(userService.findUserByUserId(userId));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,16 @@
import com.example.duserservice.vo.UserDto;
import org.modelmapper.ModelMapper;
import org.springframework.context.annotation.Lazy;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
Expand All @@ -24,12 +28,17 @@ public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
private final ModelMapper modelMapper;
private final PasswordEncoder passwordEncoder;
private final RestTemplate restTemplate;

//@Lazy : 순환참조 에러로 @Lazy 추가
public UserServiceImpl(UserRepository userRepository, ModelMapper modelMapper, @Lazy PasswordEncoder passwordEncoder) {
public UserServiceImpl(UserRepository userRepository,
ModelMapper modelMapper,
@Lazy PasswordEncoder passwordEncoder ,
RestTemplate restTemplate) {
this.userRepository = userRepository;
this.modelMapper = modelMapper;
this.passwordEncoder = passwordEncoder;
this.restTemplate = restTemplate;
}

//UserDetailService Override
Expand All @@ -45,14 +54,18 @@ public UserDetails loadUserByUsername(String userEmail) throws UsernameNotFoundE

@Override
public UserDto createUser(UserDto userDto) {
userDto.setUserId(UUID.randomUUID().toString());
String id = userDto.getEmail().split("@")[0];
userDto.setUserId(id);

userDto.setEncryptedPwd(passwordEncoder.encode(userDto.getPwd()));
UserEntity userEntity = modelMapper.map(userDto, UserEntity.class);
userRepository.save(userEntity);

return userDto;
}



//userId 찾고 order 정보도 함께 호출하기 =>restTemplate 이용
@Override
public UserDto findUserByUserId(String userId) {
UserEntity userEntity = userRepository.findByUserId(userId).orElseThrow(() ->
Expand All @@ -61,8 +74,12 @@ public UserDto findUserByUserId(String userId) {

UserDto userDto = modelMapper.map(userEntity, UserDto.class);

List<ResponseOrder> orders = new ArrayList<>();
userDto.setOrders(orders);
String orderUrl = String.format("http://ORDER-SERVICE/%s/orders" , userId); //@LoadBalancer 사용으로 주소 바꿈
// ParameterizedTypeReference :Generic 타입을 class로 넘겨줄 때 사용하는 객체
List<ResponseOrder> orderList = restTemplate.exchange(orderUrl, HttpMethod.GET, null, new ParameterizedTypeReference<List<ResponseOrder>>(){})
.getBody();

userDto.setOrders(orderList);

return userDto;
}
Expand Down
6 changes: 3 additions & 3 deletions d-user-service/src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ spring:
settings:
web-allow-others: true
path: /h2-console
datasource:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
# datasource: # 암호화 후 config server에 옮김
# url: jdbc:h2:mem:testdb
# driver-class-name: org.h2.Driver

# rabbitmq 정보
rabbitmq: #호스트 정보 기술 => ms는 클라이언트
Expand Down
3 changes: 3 additions & 0 deletions e-config-service/src/main/resources/bootstrap.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# 대칭키
encrypt:
key: jeeyoung2zizone
58 changes: 19 additions & 39 deletions readme.md
Original file line number Diff line number Diff line change
@@ -1,44 +1,24 @@
# Spring Cloud Config

# Micro Service 간 통신
``` text
spring cloud config 로 yml파일 한번에 관리하기
RestTemplate 이용하기
```
1. e-config-service
2. d-user-service
3. d-gateway-service
4. ecommerce (Eureka Server)

## RabbitMq 설치 가이드

[rabbitmq 설치 가이드 in Notion](https://absorbing-brain-061.notion.site/Rabbit-MQ-c093020f8d614a738e8903d3cd29878c)

## 공통 Dependencies

```text
implementation 'org.springframework.boot:spring-boot-starter-actuator:2.7.2'
implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap:3.1.3'
implementation 'org.springframework.cloud:spring-cloud-starter-bus-amqp:3.1.2'
- userService에서 RestTemplate 이용
- @LoadBalancer 사용으로 url을 간략화 할 수 있다.

### Bean 등록
```java
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
```

- amqp : 메시지 지향 미들웨어용 개방형 표준 응용 프로토콜
- rabbitmq 사용을 위해 추가함

## yml 파일 설정

```yaml
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest

management:
endpoints:
web:
exposure:
include: busrefresh
```
### url 사용

- rabbitMq server 주소와 정보 입력
- busrefresh : 전체파일 refresh용 endpoint
- 기존: http://lcoalhost:8000/order-service/*
- 게이트웨이 거친 버전 /order-service가 붙음

- 변경후 : http://ORDER-SERVICE/*
- 유레카에서 가져온 버전 http://localhost:0/* 와 동일함
- /order-service가 제거 됨