springboot2原理实战(20)--微服务自己实现注册发现,负载均衡小demo

简介: springboot2原理实战(20)--微服务自己实现注册发现,负载均衡小demo

概要


之前了解了很多的springboot的基础知识,现在实战下,做个微服务,什么是微服务呢?


就是按业务拆分模块,然后模块间通过restful或者rpc调用。

本文主要写


①一个服务端,一个客户端,服务端写个接口,客户端通过restful查询。


②加个注册中心:服务端把注册地址到给zookeeper,客户端通过zookeeper查询数据


③多个服务注册到zookeeper,实现负载均衡。


服务端代码地址:


https://github.com/hufanglei/springboot-v-study/tree/a-mall-product


关键代码展示:


/**
 * 服务注册
 */
@Component
public class ServiceRegister implements ApplicationRunner {
    @Value("${zookeeper.address}")
    private String zkAddress;
    @Override
    public void run(ApplicationArguments args) throws Exception {
        CuratorFramework client = CuratorFrameworkFactory.newClient(zkAddress, new RetryOneTime(1000));
        client.start();
        client.blockUntilConnected();
        ServiceInstance<Object> instance = ServiceInstance.builder().name("product").address("192.168.157.1").port(8080).build();
        ServiceDiscovery<Object> serviceDiscovery = ServiceDiscoveryBuilder
                                                    .builder(Object.class)
                                                    .client(client)
                                                    .basePath("/soa").build();
        serviceDiscovery.registerService(instance);
        serviceDiscovery.start();
        System.out.println("service register ok");
    }
}


客户端代码地址:


https://github.com/hufanglei/springboot-v-study/tree/a-mall-product-web


关键代码展示:


最简单的resful版调用


public class Client {
    public static String BASE_URL ="http://127.0.0.1:8080";
    public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();
        Response object = restTemplate.getForObject(BASE_URL + "/soa/product/1", Response.class);
        System.out.println(new Gson().toJson(object));
        String data = restTemplate.getForObject(BASE_URL + "/soa/product/1", String.class);
        System.out.println(data);
        System.out.println(new Gson().toJson(new Gson().fromJson(data, Response.class)));
        System.out.println(new Gson().toJson(new Gson().fromJson(data, Map.class).get("data")));
    }
}


zookeeper版调用


public class AMallProductWebApplication {
  public static String ZKADDRESS ="192.168.157.111:2181";
  public static void main(String[] args) throws Exception {
  CuratorFramework client = CuratorFrameworkFactory.newClient(ZKADDRESS, new RetryOneTime(1000));
  client.start();
  client.blockUntilConnected();
  ServiceDiscovery<Object> serviceDiscovery = ServiceDiscoveryBuilder
    .builder(Object.class)
    .client(client)
    .basePath("/soa").build();
  Collection<ServiceInstance<Object>> list = serviceDiscovery.queryForInstances("product");
  list.forEach((instance) ->{
    System.out.println(instance.getAddress());
    System.out.println(instance.getPort());
    RestTemplate restTemplate = new RestTemplate();
    Response resp = restTemplate.getForObject("http://"+instance.getAddress() +":"+instance.getPort() + "/soa/product/1", Response.class);
    System.out.println(resp.getCode());
    System.out.println(resp.getMsg());
    System.out.println(resp.getData());
  });
  }
}


负载均衡+zookeeper版调用

/**
 * 轮询器
 */
public class LoaderBalance {
    private int index = 0;
    private List<String> services;
    public LoaderBalance(List<String> services) {
        this.services = services;
    }
    public String choose(){
        String service = services.get(index);
        index++;
        if(index >= services.size()){
            index = 0;
        }
        return service;
    }
}


public class AppBanlance {
  public static String ZKADDRESS ="192.168.157.111:2181";
  public static void main(String[] args) throws Exception {
  CuratorFramework client = CuratorFrameworkFactory.newClient(ZKADDRESS, new RetryOneTime(1000));
  client.start();
  client.blockUntilConnected();
  ServiceDiscovery<Object> serviceDiscovery = ServiceDiscoveryBuilder
    .builder(Object.class)
    .client(client)
    .basePath("/soa").build();
  Collection<ServiceInstance<Object>> list = serviceDiscovery.queryForInstances("product");
  final List<String> services = new ArrayList<>();
  list.forEach((instance) ->{
    services.add(instance.getAddress() + ":" + instance.getPort());
  });
  System.out.println(services);
  LoaderBalance lb = new LoaderBalance(services);
  for (int i=0;i<10;i++){
    RestTemplate restTemplate = new RestTemplate();
    Response resp = restTemplate.getForObject("http://"+lb.choose()+ "/soa/product/1", Response.class);
    System.out.println(resp.getCode());
    System.out.println(resp.getMsg());
    System.out.println(resp.getData());
  }
  }
}
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
3月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
1404 0
|
7月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
5月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
969 0
|
2月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
338 3
|
2月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
444 4
|
9月前
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
501 0
|
9月前
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
364 0
|
5月前
|
前端开发 Java 数据库连接
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
|
9月前
|
Java Spring
SpringBoot自动配置原理
本文深入解析了SpringBoot的核心功能——自动配置,重点探讨了`org.springframework.boot.autoconfigure`及相关注解的工作机制。通过分析`@SpringBootApplication`、`@EnableAutoConfiguration`等注解,揭示了SpringBoot如何基于类路径和条件自动装配Bean
482 8
|
8月前
|
安全 前端开发 Java
Spring Boot 项目中触发 Circular View Path 错误的原理与解决方案
在Spring Boot开发中,**Circular View Path**错误常因视图解析与Controller路径重名引发。当视图名称(如`login`)与请求路径相同,Spring MVC无法区分,导致无限循环调用。解决方法包括:1) 明确指定视图路径,避免重名;2) 将视图文件移至子目录;3) 确保Spring Security配置与Controller路径一致。通过合理设定视图和路径,可有效避免该问题,确保系统稳定运行。
572 0

热门文章

最新文章