7.服务治理-Eureka-创建服务消费者

2020-04-21  本文已影响0人  溅十三
image.png

知识点:

1.String.format("http://%s:%s/sayHi",instance.getHost(),instance.getPort());
2.log.info("url is {}",target);
3.@Bean注解,spring会在初始化的时候会把这个方法加入到上下文,然后我们就可以在Controller里得到这个方法了

1. 启动类
package com.imooc.springcloud;

import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
public class EurekaConsumerApplication {
    /*
    * @Bean注解,spring会在初始化的时候会把这个方法加入到上下文,然后我们就可以在Controller里得到这个方法了
    * */
    @Bean
    public RestTemplate register(){
        return new RestTemplate();
    }

    public static void main(String[] args) {
        new SpringApplicationBuilder(EurekaConsumerApplication.class)
                .web(WebApplicationType.SERVLET)
                .run(args);
    }
}

2. Controller服务调用流程

业务流程:

1.拿到服务提供者的实例
2.借助RestTemplate发起真实的服务调用
3.单独声明RestTemplate
4.启动顺序:启动注册中心->服务提供者->服务消费者
5.调用消费者接口(服务消费者会调用服务提供者)

package com.imooc.springcloud;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@Slf4j
@RestController
public class Controller {

    /*
    * 负载均衡器,帮我们从注册中心拉取的服务列表中挑选一个可用的serviceprovider
    * */
    @Autowired
    private LoadBalancerClient client;

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/hello")
    public String hello(){
        /*
        * 1.拿到服务提供者的实例
        * 2.借助RestTemplate发起真实的服务调用
        * 3.单独声明RestTemplate
        * */
        ServiceInstance instance = client.choose("eureka-client");

        /*
        * 防疫性编程:假定所有的输入都是不安全的,instance可能get到空
        * */
        if (instance == null) {
            return "No aviliable instance";
        }
        String target = String.format("http://%s:%s/sayHi",instance.getHost(),instance.getPort());
        log.info("url is {}",target);
        return restTemplate.getForObject(target, String.class);
    }

    @PostMapping("/hello")
    public Friend helloPost(){
        /*
         * 1.拿到服务提供者的实例
         * 2.借助RestTemplate发起真实的服务调用
         * 3.单独声明RestTemplate
         * 4.启动顺序:启动注册中心->服务提供者->服务消费者
         * */
        ServiceInstance instance = client.choose("eureka-client");

        /*
         * 防疫性编程:假定所有的输入都是不安全的,instance可能get到空
         * */
        if (instance == null) {
            return null;
        }
        String target = String.format("http://%s:%s/sayHi",instance.getHost(),instance.getPort());
        log.info("url is {}",target);
        Friend friend = new Friend();
        friend.setName("eureka-consumer");
        return restTemplate.postForObject(target, friend,Friend.class);

    }
}
3. Entry
package com.imooc.springcloud;

import lombok.Data;

@Data
public class Friend {
    private String name;
    private String port;
}

上一篇下一篇

猜你喜欢

热点阅读