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

  • 相关阅读:
    Java Web
    Tomcat学习笔记
    Java Web学习笔记(2)
    Java Web学习笔记(1)
    2017-2018-1 Java演绎法 小组会议及交互汇总
    【Alpha版本】冲刺阶段
    【Alpha版本】冲刺阶段
    【Alpha版本】冲刺阶段
    【Alpha版本】冲刺阶段
    【Alpha版本】冲刺阶段
  • 原文地址:https://www.cnblogs.com/xyhero/p/64a2460b2f37ba9d8485a85dd6efad72.html
Copyright © 2020-2023  润新知