Spring cloud:服務調用-服務名訪問


環境

  1. spring cloud Edgware.SR6
  2. jdk 7
  3. sts 4.6.0
  4. mysql 5.7

背景

通過 IP 訪問需要知道具體的地址和端口,使用了服務注冊后,可以通過服務名進行訪問。

搭建步驟

只需要修改支付服務調用層和一些配置就可以實現。

支付服務調用層

package jiangbo.springcloud.dao;

import jiangbo.springcloud.dao.dto.PaymentRequest;
import jiangbo.springcloud.dao.dto.PaymentResponse;

public interface PaymentDao {

    PaymentResponse payment(PaymentRequest paymentRequest);
}
package jiangbo.springcloud.dao.http;

import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import jiangbo.springcloud.dao.PaymentDao;
import jiangbo.springcloud.dao.dto.PaymentRequest;
import jiangbo.springcloud.dao.dto.PaymentResponse;

@Component
public class PaymentDaoImpl implements PaymentDao {

    private static final String PAYMENT_SERIVCE_URL = "http://payment/payment";

    private final RestTemplate restTemplate;

    public PaymentDaoImpl(RestTemplate restTemplate) {

        this.restTemplate = restTemplate;
    }

    @Override
    public PaymentResponse payment(PaymentRequest paymentRequest) {

        return restTemplate.postForObject(PAYMENT_SERIVCE_URL, paymentRequest, PaymentResponse.class);
    }

}

啟動類

package jiangbo.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableEurekaClient
public class JiangBoApplication {

    public static void main(String[] args) {

        SpringApplication.run(JiangBoApplication.class, args);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(RestTemplateBuilder builder) {

        return builder.build();
    }
}

增加日志

因為有三台支付微服務,為了方便看到訪問了哪一台,增加端口的日志記錄。

package jiangbo.springcloud.controller;

import java.util.List;

import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import jiangbo.springcloud.entity.PaymentInfo;
import jiangbo.springcloud.service.PaymentService;

@RestController
@RequestMapping("/payment")
public class PaymentContrller {

    private final PaymentService paymentService;

    private final int port;

    public PaymentContrller(PaymentService paymentService, @Value("${server.port}") int port) {

        this.paymentService = paymentService;
        this.port = port;
    }

    @PostMapping
    public PaymentInfo newPaymentInfo(@RequestBody PaymentInfo paymentInfo) {

        LoggerFactory.getLogger(getClass()).info("invoke payment port: {}", port);
        return paymentService.insertPaymentInfo(paymentInfo);
    }

    @GetMapping
    public List<PaymentInfo> allPayemtns() {

        return paymentService.queryAllPayments();
    }
}

驗證

使用 curl 命令訪問訂單微服務,查看返回,如果返回的訂單已支付,則表示通過服務名訪問成功。

curl -H "Content-Type: application/json" -X POST --data '{"name":"jiangbo10","amount":"8.88"}', http://localhost:4410/order/payment
{"id":11,"name":"jiangbo10","amount":"8.88","status":"PAID","createTime":1587303467000,"updateTime":1587303467000}    

多訪問幾次,能看到支付微服務被輪詢調用。到此,客戶端的負載均衡也一並實現了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM