Skip to content

Commit

Permalink
Merge pull request #10 from sazzeo/microservice-communication/rest-te…
Browse files Browse the repository at this point in the history
…mplate

Microservice communication/rest template
  • Loading branch information
sazzeo authored Aug 12, 2022
2 parents b77e2b6 + 1015c92 commit 3794ac9
Show file tree
Hide file tree
Showing 8 changed files with 64 additions and 58 deletions.
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가 제거 됨

0 comments on commit 3794ac9

Please sign in to comment.