SpringCloud 는 어떻게 Eureka 를 사용 하여 서비스 간 의 전달 데 이 터 를 실현 합 니까?

여러분 이 가장 관심 을 가 지 는 것 은 분명 많은 이론 이 아니 라 알 듯 모 르 는 것 같 습 니 다.가장 관심 을 가 지 는 것 은 서비스 간 의 매개 변수 전달,데이터 획득 입 니 다.
Ok,오늘 은 세 가지 마이크로 서비스 간 에 데 이 터 를 전송 하 는 방식 을 알려 드 리 겠 습 니 다.각각:
1.가장 기본 적 인 Ip 포트 를 이용 하여 인터페이스 에 접근 하여 데이터 전송 을 요청 합 니 다.
2.Ip(하 드 인 코딩)대신 Eureka 를 사용 하여 데이터 전송 실현
3.Feign 이 더욱 빠 르 고'서비스 나 누 기'방식 으로 마이크로 서비스 간 의 데이터 전송 을 실현 합 니 다.
전제:Eureka 등록 센터 를 구축 하고 현재 주문 마이크로 서비스(서비스 소비자),한 사용자 마이크로 서비스(서비스 제공 자)가 있다 고 가정 한 다음 에 주문 마이크로 서비스 가 사용자 마이크로 서 비 스 를 호출 하여 사용자 의 정 보 를 얻 고 두 서비스 가 정상적으로 작 동 할 수 있다 고 가정 합 니 다.여기 서 SpringJpa 방식 으로 데 이 터 를 얻 을 수 있 도록 합 니 다.
1.RestTemplate+Ip 방식 사용:
1.데 이 터 를 전달 하 는 것 은 대부분이 집합 과 대상 의 형식 으로 전달 되 기 때문에 여기 서 집합 과 대상 의 방식 으로 예 를 들 면
사용자 마이크로 서비스(서비스 제공 자)에 호출 된 조회 방법 을 작성 하 십시오.

@RestController
@RequestMapping("/user")
public class UserController {
 
    @Resource
    private UserRepository userRepository;
 
    @GetMapping("/getallUser")
    public List<User> getUserPage(){
        return userRepository.findAll();
    }
 
    @GetMapping("/getUser")
    public User getUser(Long userId){
        return userRepository.getOne(userId);
    }
}

@Repository
public interface UserRepository extends JpaRepository<User,Long> {
}

@Entity
@Table(name="TM_USER")
@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
public class User implements Serializable, Cloneable {
 
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long userId;
 
    /**
     *    
     */
    @Column(name = "USER_NAME")
    private String userName;
 
    /**
     *    
     */
    @Column
    private String name;
 
    /**
     *   
     */
    @Column
    private BigDecimal balance;
 
    /**
     *     get set          
     */
    @Column
    private int age;}
Ok,서비스 제공 자가 작성 되 었 습 니 다.다음은 서비스 소비 자 를 작성 하 겠 습 니 다.
2.주문 마이크로 서비스(서비스 소비자)의 시작 클래스 에 RestTemplate 를 생 성 하 는 Bean 을 추가 합 니 다.

@SpringBootApplication
@EnableEurekaClient  //  eureka   
public class MicroserviceSimplecConsumerOrderServerApplication {
 
 @Bean
 public RestTemplate restTemplate(){
  return new RestTemplate();
 }
 
 public static void main(String[] args) {
  SpringApplication.run(MicroserviceSimplecConsumerOrderServerApplication.class, args);
 }
}
주문 마이크로 서비스(서비스 소비자)프로필 yml 에 추 가 됩 니 다.그 중에서 localhost:9021 은 사용자 마이크로 서비스(서비스 제공 자의 Ip 와 포트)로 바 뀌 었 습 니 다.

user:
  urlPath: http://localhost:9021
주문 서비스 제어 층 을 작성 합 니 다.이 곳 의 User 는 사용자 에 게 마이크로 서 비 스 를 복사 한 다음@Column,@Table 등 설명 을 삭제 합 니 다.임시 저장 대상 일 뿐 데이터베이스 와 아무런 관련 이 없습니다.

@RestController
@RequestMapping("/order")
public class OrderServerController {
 
    @Autowired
    private RestTemplate restTemplate;
 
    @Value("${user.urlPath}")
    private String urlPath;
    //      
    @GetMapping("/allUser")
    private List<User> getAllUser(){
        ResponseEntity<List<User>> responseEntity = restTemplate.exchange("urlPath"+/user/getallUser?",
                HttpMethod.GET, null, new ParameterizedTypeReference<List<User>>() {});
        return responseEntity.getBody();
    }
    //        
    @GetMapping("/getUser")
    private User getUser(Long userId){
        User user = restTemplate.getForObject("urlPath"+/user/getUser?userId="+userId,User.class);
        return user;
    }
}
2.유레카 의 방식 으로 획득
간단 하 다.사용자 마이크로 서비스의 서비스 이름 을 가정 합 니 다:microservice-privider-user

spring:
  application:
    name: microservice-privider-user
그리고 바로 교체 처 리 를 할 수 있 습 니 다.즉,:

@GetMapping("/allUser")  //    
   private List<User> getAllUser(){
        ResponseEntity<List<User>> responseEntity = restTemplate.exchange("microservice-privider-user"+"/user/getallUser", HttpMethod.GET, null, new ParameterizedTypeReference<List<User>>() {});
        return responseEntity.getBody();
    }
//    
    @GetMapping("/getUser")
    private User getUser(Long userId){
        User user = restTemplate.getForObject("microservice-privider-user"+/user/getUser?userId="+userId,User.class);
        return user;
    }
Ok,두 번 째 방식 으로 작 성 했 습 니 다.
서비스 이름 으로 고정된 IP 를 교체 하여 Ip 하 드 인 코딩 이 유지 하기 어 려 운 문 제 를 해결 하 였 습 니 다.
세 번 째 Feign 방식 은 나중에"Feign:성명 성 Rest 클 라 이언 트"를 설명 할 때 자세히 설명 합 니 다.
gitHub 주소:https://github.com/mackjie/microservice-spring-cloudRabbitMQ 가 설정 되 어 있 기 때문에 ReadMe 를 읽 고 시작 항목 을 진행 하 십시오.그렇지 않 으 면 시작 오류 가 발생 합 니 다.
springcloud 학습 의 Eureka Client 구축 과 서비스 간 호출
Eureka 클 라 이언 트 구축:
pom 의존 도입

<!-- Eureka Client -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.시작 클래스 추천 추가@EnableEurekaClient 설명
바로 선택 한 등록 센터 가 eureka 라면@EnableEureka Client 를 추천 합 니 다.
다른 등록 센터(zookeeper,consul 등)라면@EnableDiscovery Client 를 추천 합 니 다.
3.프로필 추가:

#eureka
spring.application.name=producer
#      
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
#       
eureka.client.register-with-eureka=true
#        
eureka.client.fetch-registry=true
 
#  ip    
eureka.instance.prefer-ip-address=true
#           
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
서비스 호출:
두 가지 방법 이 있 습 니 다.
1.ribbon(부하 균형)+restTemplate
시작 클래스 추가:

@Bean
@LoadBalanced//    
public RestTemplate initRestTemplate() {
 return new RestTemplate();//
 }
 
 @Bean//       ,        :  ,    ,   
 public IRule initIRule() {
  return new RandomRule();
 }
RandomRule 은 무 작위 정책 을 표시 합 니 다.
RoundRobinRule 은 폴 링 정책 을 표시 합 니 다(기본 값)
Weighted ResponseTimeRule 는 가중 정책 을 표시 합 니 다.
BestAvailableRule 은 요청 수 최소 정책 을 표시 합 니 다.
그리고 controller 에 RestTemplate 를 자동 으로 설치 한 후 restTemplate.getForObject()호출 을 사용 합 니 다.
2.feign(추천)
1.pom 의존 도입

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>
2.시작 클래스 에@EnableFeignClient 설명 추가
3.인 터 페 이 스 를 만 들 고,

package com.sumengnan.test.web;
 
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
 
@FeignClient(name = "eureka",fallback = HtystrixEurekaFallback.class)//           
public interface EurekaServiceApi {
    @GetMapping("test")
    String test();
}
스크롤 백 방법:

package com.sumengnan.test.web;
 
/**
 * eureka     
 */
public class HtystrixEurekaFallback implements EurekaServiceApi {
    @Override
    public String test() {
        return "    ,     !";
    }
}
4.그리고 controller 에 Eureka ServiceApi 를 자동 으로 설치 한 후 eureka ServiceApi.test()를 사용 하여 호출 합 니 다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기