详解springcloud之服务注册与发现

网友投稿 257 2023-01-30


详解springcloud之服务注册与发现

本次分享的是关于springcloud服务注册与发现的内容,将通过分别搭建服务中心,服务注册,服务发现来说明;现在北京这边很多创业公司都开始往springcloud靠了,可能是由于文档和组件比较丰富的原因吧,毕竟是一款目前来说比较完善的微服务架构;本次分享希望能给大家带来好的帮助;

Eureka服务中心

Provider注册服务

Consumer发现服务

Eureka服务中心高可用

Eureka服务中心

就我现在了解到并且用的比较多的注册中心有zookeeper和Eureka,我的上上篇文章分享了dubbo+zookeeper来构建服务,因此本次用的是Eureka,springcloud框架也是推荐它来作为注册中心,当然可以集成其他的服注册中心,毕竟springcloud依赖于springboot来构建项目的,因此集成其他组件是很快的;首先创建注册中心项目 eureka_server ,通过如下引入依赖:

org.springframework.cloud

spring-cloud-starter-eureka-server

然后在application.yml文件中增加配置项:

server:

port: 2001

spring:

application:

name: eureka-server

eureka:

client:

register-with-eureka: false #禁止自己当做服务注册

fetch-registry: false #屏蔽注册信息

instance:

prefer-ip-address: true

instance-id: ${spring.application.name}:${server.port}

配置完成后,还需要再启动类增加注解 @EnableEurekaServer ,设置基本完成即可运行,访问  http: // localhost:2001/ 得到如下界面:

Provider注册服务

有了服务注册中心,我们还需要提供一些服务并且把这些服务注册到服务中心去,这里为了方便先创建一个服务提供者和消费者共同使用的接口模块项目 eureka_api ,并创建如下接口和请求返回参数实体类:

public interface UserInterface {

@PostMapping("/users")

MoRp&gDIbjAzgt; getUsers(MoRq rq);

@GetMapping("/msg")

String getMsg();

}

MoUser实体:

public class MoUser {

private long id;

private String userName;

private String userPwd;

public long getId() {

return id;

}

public void setId(long id) {

this.id = id;

}

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getUserPwd() {

return userPwd;

}

public void setUserPwd(String userPwd) {

this.userPwd = userPwd;

}

}

然后创建我们的服务提供端的模块 eureka_provider ,同样引入eureka依赖不过和server端有点区别:

org.springframework.cloud

spring-cloud-starter-eureka

再来创建服务提供端要提供的服务UserController,并且实现我们eureka_api模块中的UserInterface接口,代码如下:

@RestController

public class UserController implements UserInterface {

@Autowired

private HttpServletRequest request;

@Override

public MoRp> getUsers(MoRq rq) {

MoRp> rp = new MoRp<>();

List list = new ArrayList<>();

for (int i = 0; i < 5; i++) {

MoUser moUser = new MoUser();

moUser.setId(i);

moUser.setUserName("神牛" + i);

list.add(moUser);

}

rp.setT(list);

rp.setStatus(list.size() >= 1 ? 1 : 0);

rp.setMessage(list.size() >= 1 ? "" : "暂无数据");

return rp;

}

@Override

public String getMsg() {

return "这里是provider,端口:"+ request.getServerPort();

}

}

这里需要注意的是Controller的两个服务接口中没有再加PostMapping或GetMapping,因为这个由被实现接口申明了;定义好了users和msg服务后,我们还需要能把他们注入到服务注册中心去,因此需要如下application.yml的配置:

spring:

application:

name: eureka-provider #服务名称

eureka:

client:

service-url:

defaultZone: http://localhost:2001/eureka/ #服务中心地址

instance:

prefer-ip-address: true

instance-id: ${spring.application.name}:${server.port}

server:

port: 2004

我们还需要在启动类增加如下标记 @EnableEurekaClient ,它表示启动eureka客户端,因为服务提供者相对服务中心来说是属于客户端的存在;当运行eureka_provider项目的时候,我们在注册中心能看到如下信息:

为了保证服务提供端接口没问题,我们可以直接点击eureka-provider:2004,然后增加要方法接口的路径我这里是:http://192.168.153.148:2004/msg,即可得到如下正常访问接口返回的信息:

Consumer发现服务

有了接口服务,我们还需要消费服务,因此创建module项目eureka_consumer,因为这里采用fegin伪客户端的方式来访问我们服务提供端,并且同样需要引入eureka的依赖:

org.springframework.cloud

spring-cloud-starter-eureka

org.springframework.cloud

spring-cloud-starter-feign

然后在service层定义UserService服务并且实现公共接口模块 eureka_api 中的接口,代码如:

@FeignClient(value = "eureka-provider")

public interface UserService extends UserInterface {

}

通过FeignClient来指定调用的服务端应用名称eureka-provider,这名称对应注册在服务中心的Application目录下 ,在Controller层创建一个响应的输出UserController并分别提供两个展示的接口,代码如:

@RestController

public class UserController{

@Autowired

private UserService userService;

@GetMapping("/users")

public MoRp> getUsers(MoRq rq) {

return userService.getUsers(rq);

}

@GetMapping("/msg")

public String getMsg() http://{

return userService.getMsg();

}

}

同样Consumer端也需要在application.yml中配置一些信息:

spring:

application:

name: eureka-consumer

eureka:

client:

service-url:

defaultZone: http://localhost:2001/eureka/ #注册中心地址

instance:

prefer-ip-address: true

instance-id: ${spring.application.name}:${server.port}

server:

port: 2005

配置基本和provider端差不多,最后需要在启动类申明如下注解:

@SpringBootApplication

@EnableDiscoveryClient //消费者客户端

@EnableFeignClients //feign客户端

public class EurekaConsumerApplication {

public static void main(String[] args) {

SpringApplication.run(EurekaConsumerApplication.class, args);

}

}

启动eureka_consumer项目后,我们能在注册中心看到它注册进来的信息:

然后通过访问eureka_consumer消费方的接口测试eureka_provider服务提供方的接口数据知否能正常响应,接口地址 http: // 192.168.153.148:2005/msg :

通过访问consumer得到了provider的结果,这就是服务注册和发现的基本测试流程;至于消费方怎么请求到提供方接口的,我们通过如下手工图可解:

Eureka服务中心高可用

由上面手工图来看,服务中心承担着很重要的角色,通常这种服务中心不仅仅只搭建一个,因此需要搭建一套高可用的服务中心出来;其实很简单provider和consumer配置都不用动,我们只需要在第一节点的eureka-server项目的application.yml中配置下并且在多启动几个不同端口的服务就行了(同一台服务器是多个端口,不同服务器端口可能是一样的):

server:

port: 2001

spring:

application:

name: eureka-server

eureka:

client:

register-with-eureka: true #配置高可用的时候需要开放自己注册自己

fetch-registry: true

service-url:

defaultZone: http://localhost:2002/eureka/ #注册到端口2002的eureka中

# defaultZone: http://localhost:2001/eureka/

instance:

prefer-ip-address: true

instance-id: ${spring.application.name}:${server.port}

server:

eviction-interval-timer-in-ms: 2000 #剔除失效服务间隔

高可用配置需要注意以下几点:

register-with-eureka: true 配置高可用的时候需要开放自己注册自己,便于多个eureka注册中心互通

defaultZone:http://localhost:2002/eureka/ 每个注册中心都需要吧自己注册到别的注册中心去

这里我创建了两个注册中心地址分别为:http://localhost:2001/,http://localhost:2002/;由于之前provider和consumer配置的注册中心地址都是2001端口的,为了验证高可用我们需要访问2002端口注册中心,效果如:

能够看到2002端口有着2001端口同样的注册信息,当我关闭2001端口的应用时,2002还是能够查到provider和consumer的信息,更详细的配置可以参照官网说明。

git地址: https://github.com/shenniubuxing3

nuget 发布包:https://nuget.org/profiles/shenniubuxing3


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:路由器无法连接共享文件夹(路由器无法连接共享文件夹怎么回事)
下一篇:Java用正则对字符串进行处理并判断是否能转为数字
相关文章

 发表评论

暂时没有评论,来抢沙发吧~