springcloud使用(三) 服务提供与消费

服务注册中心已经有了: 现在需要服务提供者和服务消费者
案例要求很简单: 消费者调用服务请求hello, 根据传入参数name, 实现返回"hello, name"即可

1. 搭建服务提供者producer

pom如下

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

配置application.properties

# 服务提供者
spring.application.name=spring-cloud-eureka-producer
server.port=9000
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

*取消了eureka.client.register-with-eureka 和eureka.client.fetch-registry的配置, 因为默认为true, 就是要将其注册到注册中心register

在项目启动类添加注解@EnableEurekaClient
编写服务

@RestController
public class ApiHello {
    /*@Autowired
    private LoadBalancerClient loadBalancerClient;*/

    @RequestMapping(value = "/hello")
    public String sayHello(HttpServletRequest request) throws IllegalAccessException {
        String name = request.getParameter("name");
        /*String age = request.getParameter("age");
        if(age.equals("23")){
            throw new IllegalAccessException("我出错了xox");
        }*/
//        System.out.println("我是9001");
        return JSON.toJSONString("hello,"+name);
    }
}

启动项目, 访问http://localhost:8000/, 注册应用出多了应用SPRING-CLOUD-EUREKA-PRODUCER
看见屏幕中间有一排红字不要慌, 那是告诉咱们没有消费者

小场面, 不要慌

再访问http://localhost:9000/hello?name=李四, 返回"hello,李四"说明服务正常, 开始搭建消费者

2. 搭建服务消费者consumer

pom如下, 和producer一样, 都依赖spring-cloud-starter-netflix-eureka-client

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

配置application.properties

# 服务消费者
spring.application.name=spring-cloud-eureka-consumer
server.port=9001
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

在项目启动类添加注解@EnableEurekaClient, 和提供者一样
消费者代码
基于Ribbon,Ribbon是一个客户端的负载均衡器,它提供对大量的HTTP和TCP客户端的访问控制

@RestController
public class ApiHello {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/consumer/hello")
    public String hello(HttpServletRequest request) throws JsonProcessingException {
        String name = request.getParameter("name");
        MultiValueMap<String, String> map= new LinkedMultiValueMap<>();
        map.add("name",name);
        return this.restTemplate.postForObject("http://spring-cloud-eureka-producer/hello",map,String.class);
    }
}

启动消费者, 浏览器访问http://localhost:8000, 看见application出现了两个应用, 一个消费者, 一个提供者. 继续访问http://localhost:9001/consumer/hello?name=%E4%BD%A0%E6%98%AF%E5%82%BB%E5%AD%90, 如果出现"hello, 你是傻子", 说明服务和消费都正常

3. 负载均衡

在提供者的服务代码中加入打印port即可

@RestController
public class ApiHello {
    /*@Autowired
    private LoadBalancerClient loadBalancerClient;*/

    @RequestMapping(value = "/hello")
    public String sayHello(HttpServletRequest request) throws IllegalAccessException {
        String name = request.getParameter("name");
        /*String age = request.getParameter("age");
        if(age.equals("23")){
            throw new IllegalAccessException("我出错了xox");
        }*/
        System.out.println("我是9000");
        return JSON.toJSONString("hello,"+name);
    }
}

启动, 修改端口号比如9002, 打印语句也改成9002, 其他都不用改,打包启动
浏览器访问http://localhost:9001//consumer/hello?name=%E4%BD%A0%E6%98%AF%E5%82%BB%E5%AD%90, 分别在控制台能看见9000端口服务打印 我是9000, 9002端口服务打印 我是9002. 轮询调用, 这也就实现了负载均衡

4. 基于feign的服务消费者

Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果

可以新建一个module, 也可以在前面的消费者上面改
pom中加入spring-cloud-starter-openfeign依赖

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

application.properties不变
启动类上注解如下

@SpringBootApplication
@EnableDiscoveryClient      // 启用服务注册与发现
@EnableFeignClients         // 启用feign进行远程调用

新建接口

@FeignClient(value ="spring-cloud-eureka-producer")
public interface  HelloService {
    @RequestMapping("/hello")
    String hello(@RequestParam(value = "map") Map<String,String> map);
}

controller调用该接口

@RestController
public class ApiHello {
    @Autowired
    HelloService helloService;

    @RequestMapping("/feign/hello")
    public String hello(HttpServletRequest request){
        String name = request.getParameter("name");
//        String age = request.getParameter("age");
        Map<String, String> map = new HashMap<>();
        map.put("name",name);
//        map.put("age",age);
        // 调用多个服务
        return helloService.hello(map);
    }
}

ok, 浏览器访问http://localhost:9003/feign/hello?name=%E6%9D%8E%E5%9B%9B, 结果正常即可, 当然feign也可以实现负载均衡, 启动两个服务提供者即可
over

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • SpringCloud学习04--服务消费Ribbon和Feign RibbonRibbon 是一个基于HTTP和...
    it_zzy阅读 16,943评论 0 1
  •  通过前面两章对Spring Cloud Ribbon和Spring Cloud Hystrix的介绍,我们已经掌...
    Chandler_珏瑜阅读 212,693评论 15 140
  • 年少就爱爬山。喜爱爬山并不只为登顶的一刹满足,更值得玩味和珍惜的是山路中的心情。 山,看似是沉默的。实际上,它一刻...
    安安的歌阅读 237评论 0 0
  • 今早又下雨了,雷雨。 据说5点左右打雷了,没有听见。 雨一直下到进公司吃完早餐,之后停了。 今天又听到了新的消息。...
    心心_幸会阅读 163评论 0 0