springcloud微服務架構搭建:服務調用


spring-cloud調用服務有兩種方式,一種是Ribbon+RestTemplate, 另外一種是Feign

Ribbon是一個基於HTTP和TCP客戶端的負載均衡器,類似nginx反向代理,可以很好的控制htt和tcp的一些行為。Feign默認集成了ribbon(即不用添加ribbon的jar包也能使用ribbon負載均衡),只要使用@FeignClient時,ribbon就會自動使用。ribbon負載均衡默認使用輪詢策略,即多個服務依次輪回調用。

springcloud調用服務的底層原理:

客戶端、服務端想注冊中心注冊服務,注冊中心登記了服務的ip,端口號和服務名,當有客戶端調用服務時,通過HttpClient技術獲取服務的接口信息。

前提:

客戶端:service-a

server:
  port: 8081
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1111/eureka
spring:
  application:
    name: service-a

服務端:service-a

server:
  port: 8082
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1111/eureka
spring:
  application:
    name: service-b

一、Ribbon+REST(不常用)

1、在客戶端添加依賴包

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

2、在客戶端啟動類中注冊RestTemplate,並使用@LoadBalanced開啟負載功能

@EnableEurekaClient
@SpringBootApplication
public class ServiceAApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceAApplication.class, args);
    }
    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

3、在客戶端系統中寫一個測試controller

@RestController
public class TestController {
    @Autowired
    RestTemplate restTemplate;
     
    @RequestMapping("/hi")
    public String hi(@RequestParam String id){
        return restTemplate.getForObject("http://service-b/hi?id="+id, String.class);
    }
}

4、在服務端系統中提供一個hi()方法,供客戶端調用

@EnableEurekaClient
@RestController
@SpringBootApplication
public class ServiceBApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceBApplication.class, args);
    }
    @Value("${spring.application.name}")
    private String name;
    @Value("${server.port}")
    private String port;
    @RequestMapping("/hi")
    public String hi(@RequestParam String id){
        return "hi, " + id + ", " + name + ":" + port;
    }
}

5、重新啟動客戶端和服務端

6、測試,瀏覽器訪問

http://localhost:8081/hi?id=123

返回結果:

hi, 123, service-b:8082

二、feign(常用)

1、在客戶端添加依賴包

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

2、在客戶端啟動類中使用@EnableFeignClients開啟feiginClient功能

@EnableEurekaClient
@EnableFeignClients
@SpringBootApplication
public class ServiceAApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceAApplication.class, args);
    }
}

3、新建一個ServiceAFeignClient接口調用service-b的服務

package com.example.servicea;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Component
@FeignClient(value = "service-b") //這里的name對應調用服務的spring.applicatoin.name
public interface ServiceAFeignClient {
    @RequestMapping(value = "/hi")
    String hi(@RequestParam("id") String id);
}

4、在客戶端系統中寫一個測試controller

@RestController
public class TestController {
    @Autowired
    ServiceAFeignClient serviceAFeignClient;
     
    @RequestMapping("/hi")
    public String hi(@RequestParam String id){
        return serviceAFeignClient.hi(id);
    }
}

運行后的結果應該是和ribbon的相同。個人感覺使用feign比較舒服,代碼比較簡潔。


免責聲明!

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



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