玩转springcloud(三):服务的提供者与调用者(注册于发现)
一、简介
上文我们实践了cloud的注册中心的单服务于多节点的搭建,房子造好了得有人来住不是,这篇我们实践下服务提供者于调用者的案例,也就是服务端和客户端的调用。
本文会设计三个module:注册中心(eureka),服务提供方(server),服务调用方(client)。其中注册中心,我们就用上文搞的,不能重复造轮子啊~~
简单说下项目执行及调用过程:首先启动注册中心,然后在启动服务端和客户端,服务端会注册到注册中心,
二、实践演练
服务提供方
我们在服务端创建一个接口可接收字符串参数,然后拼接这个参数输出("hello " + 参数 + ",this is first messge,我是8079服务哦")
1、老生常谈,先上pom依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
2、配置文件走起
spring:
application:
name: spring-cloud-eureka-producer
server:
port: 8079
eureka:
client:
serviceUrl:
defaultZone: http://xjy1:8097/eureka/
参数之前都结实过啦,这里不再赘述
3、启动类添加注解@EnableDiscoveryClient
package com.oldmonk.cloud; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /**
* @program: cloud
* @description: 启动类
* @author: xujingyang
* @create: 2019-10-09 12:06
**/
@SpringBootApplication
@EnableDiscoveryClient
public class ErkaProducerApplication {
public static void main(String[] args) {
SpringApplication.run(ErkaProducerApplication.class);
}
}
添加@EnableDiscoveryClient注解后,项目就具有了服务注册的功能。启动工程后,就可以在注册中心的页面看到SPRING-CLOUD-PRODUCER服务。
4、提供的接口服务
package com.oldmonk.cloud.controller; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; /**
* @program: cloud
* @description: 测试接口
* @author: xujingyang
* @create: 2019-10-08 14:45
**/
@RestController
public class Hello { @RequestMapping("/hello")
public String index(String name) {
return "hello " + name + ",this is first messge,我是8079服务哦";
} }
5、启动注册中心,然后启动服务提供方,得下图

至此服务提供方就配置完成了!
服务调用方
1、老生常谈,先上pom依赖 ,与提供方是一样的
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
2、配置文件走起
spring:
application:
name: spring-cloud-eureka-consumer
server:
port: 9009
eureka:
client:
serviceUrl:
defaultZone: http://xjy1:8097/eureka/
3、启动类添加注解
package com.oldmonk.cloud; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients; /**
* @program: cloud
* @description: 启动类
* @author: xujingyang
* @create: 2019-10-09 12:06
**/
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ErkaConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ErkaConsumerApplication.class);
}
}
@EnableDiscoveryClient:启用服务注册与发现@EnableFeignClients:启用feign进行远程调用
Feign是一个声明式Web Service客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
4、客户端接口
package com.oldmonk.cloud.controller; import com.oldmonk.cloud.service.remote.HelloRemote;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; /**
* @program: cloud
* @description: 测试接口
* @author: xujingyang
* @create: 2019-10-08 14:45
**/
@RestController
public class HelloController { @Autowired
HelloRemote remote; @RequestMapping("/hi/{name}")
public String index(@PathVariable("name") String name) {
return remote.hello(name);
} }
5、feign调用
package com.oldmonk.cloud.service.remote; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; /**
* @program: cloud-lx
* @description: 远程服务调用
* @author: xujingyang
* @create: 2019-10-09 13:07
**/
@FeignClient(name = "spring-cloud-eureka-producer")
public interface HelloRemote { @RequestMapping("/hello")
String hello(@RequestParam("name") String name);
}
参数必须保持一致与服务提供方的接口
6、启动

至此,服务调用方配置完成
测试
简单调用
1、先输入:http://localhost:8079/hello?name=xjy检查服务提供方服务是否正常

说服务提供方正常启动,提供的服务也正常。
2、浏览器中输入:http://localhost:9009/hi/xjy

说明客户端已经成功的通过feign调用了远程服务hello,并且将结果返回到了浏览器。
多节点负载均衡
1、把生产者配置文件做下改动
---
spring:
application:
name: spring-cloud-eureka-producer
profiles:
active: xjy1
server:
port: 8079
eureka:
client:
serviceUrl:
defaultZone: http://xjy1:8097/eureka/ ---
spring:
application:
name: spring-cloud-eureka-producer
profiles:
active: xjy2
server:
port: 8078
eureka:
client:
serviceUrl:
defaultZone: http://xjy1:8097/eureka/
2、controller也要修改下
package com.oldmonk.cloud.controller; import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; /**
* @program: cloud
* @description: 测试接口
* @author: xujingyang
* @create: 2019-10-08 14:45
**/
@RestController
public class Hello { @Value("${spring.profiles}")
private String profile; @RequestMapping("/hello")
public String index(String name) {
return "hello " + name + ",this is first messge,我是【" + profile + "】服务哦";
} }
2、打包,按照之前说的方式启动两次
启动2个服务形成集群注册中心,启动命令:
java -jar eureka-producer-cluster-0.0.-SNAPSHOT.jar --spring.profiles.active=xjy1
java -jar eureka-producer-cluster-0.0.-SNAPSHOT.jar --spring.profiles.active=xjy2
3、然后看到注册中心两个服务都注册进来了,加上消费方一共三个服务

4、然后在浏览器再次输入:http://localhost:9009/hi/xjy 进行测试:
第一次返回结果:hello xjy,this is first messge,我是【xjy1】服务哦
第二次返回结果:hello xjy,this is first messge,我是【xjy2】服务哦
不断的进行测试下去会发现两种结果交替出现,说明两个服务中心自动提供了服务均衡负载的功能。
如果我们将服务提供者的数量在提高为N个,测试结果一样,请求会自动轮询到每个服务端来处理。
三、案例源码
连接点不动时请复制粘贴此链接:https://github.com/oIdmonk/springcloud-xjy
代码基于boot2.1.9.RELEASE版本,cloudGreenwich.SR3版本
玩转springcloud(三):服务的提供者与调用者(注册于发现)的更多相关文章
- 十七、springcloud(三)服务的注册与调用
1.启动服务注册中心Eureka(见上篇) 启动成功后,暂时无服务 2.项目框架 3.创建服务提供者(spring-cloud-houge-provider)jar a.application.pro ...
- SpringCloud微服务小白入门之Eureka注册中心和服务中心搭建示例
一.注册中心配置文件 代码复制区域: spring: application: name: spring-cloud-server server: port: 7000 eureka: instanc ...
- 微服务通信之feign的注册、发现过程
前言 feign 是目前微服务间通信的主流方式,是springCloud中一个非常重要的组件.他涉及到了负载均衡.限流等组件.真正意义上掌握了feign可以说就掌握了微服务. 一.feign的使用 f ...
- SpringCloud的入门学习之概念理解、Eureka服务注册与发现入门
1.微服务与微服务架构.微服务概念如下所示: 答:微服务强调的是服务的大小,它关注的是某一个点,是具体解决某一个问题.提供落地对应服务的一个服务应用,狭意的看,可以看作Eclipse里面的一个个微服务 ...
- 微服务框架SpringCloud(Dalston版)学习 (一):Eureka服务注册与发现
eureka-server eureka服务端,提供服务的注册与发现,类似于zookeeper 新建spring-boot工程,pom依赖: <dependency> <groupI ...
- SpringColud Eureka的服务注册与发现
一.Eureka简介 本文中所有代码都会上传到git上,请放心浏览 项目git地址:https://github.com/839022478/Spring-Cloud 在传统应用中,组件之间的调用,通 ...
- 玩转SpringCloud(F版本) 三.断路器(Hystrix)RestTemplate+Ribbon和Feign两种方式
此文章基于: 玩转SpringCloud 一.服务的注册与发现(Eureka) 玩转SpringCloud 二.服务消费者(1)ribbon+restTemplate 转SpringCloud 二.服 ...
- 三. SpringCloud服务注册与发现
1. Eureka 1.1 Eureka理解 什么是服务治理 Spring Cloud封装了Netflix公司开发的Eurkeka模块来实现服务治理 在传统的rpc远程调用框架中,管理每个服务与服务之 ...
- springcloud(第三篇)springcloud eureka 服务注册与发现 *****
http://blog.csdn.net/liaokailin/article/details/51314001 ******************************************* ...
随机推荐
- 读写Session
读写Session Session是保存在服务端的字典 Session与Cookie有些类似,都是通过字典管理key-value对,只不过Cookie是保存在客户端的字典,而Session是保存在服务 ...
- Vuforia笔记1(Vuforia8.0.10与Unity2018.3.6f1)
一丶ARCamera(AR的灵魂) 1.World Center Mode SPECIFIC_TARGET:制定一个物体作为世界中心坐标 FIRST_TARGET:摄像机所照射到的第一个需要识别的目标 ...
- 使用canal通过mysql复制协议从binlog实现热数据nosql缓存(1)
binlog: mysql在运行过程中执行的DML(增删改)操作都会以二进制形式记录在binlog中 canal server: canal server作为从数据库(slave)向主数据库发送dum ...
- shell中得到当下路径所有文件夹名称
方法1: for dir in $(ls -al ./|awk '/^d/ {print $NF}') do echo $dir done 方法2: for dir in $(ls ./) d ...
- JavaSE基础(十一)--Java数组
Java 数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java 语言中提供的数组是用来存储固定大小的同类型元素. 数组特点: 其长度是确定的.数 ...
- python的logging的配置
在python项目中,开发环境是windows环境,发布环境是linux系统. import logging import logging.handlers import platform impor ...
- Docker的安装和学习
dockers学习 2019年2月23日开始 docker系统要求 centos 7 核心为3.1以上 centos6.5以上 核心为 2.6以上 ...
- Linux 多命令语句与重定向
多命令语句 Linux中我们在shell输入命令一般是一条一条执行,但是我们同样可以用一行语句写出多命令,下面就举出几个常见的方法 “;”分号用法 方式:command1 ; command2 用;号 ...
- 第11章:使用Python打造MySQL专家系统
1.Python语言高级特性 1).深入浅出Python生成器 1).生成器函数:与普通函数定义类似,使用yield语句而不是return语句返回结果.yield语句一次返回一个结果,在每个结果中间挂 ...
- WPF DataGrid控件中某一列根据另一个文本列的值显示相应的模板控件
之前做项目的时候需要实现这样一个功能.WPF DataGrid有两列,一列为"更新状态”列,一列为"值"列,如果"更新状态"列的值为“固定值更新”,则 ...