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比较舒服,代码比较简洁。

猜你喜欢

转载自www.cnblogs.com/xyhero/p/64a2460b2f37ba9d8485a85dd6efad72.html