• springcloud


    目录

    1、 微服务的问题及一些解决方案

    1.1 HTTP的RESTful接口以及基于TCP的RPC协议 的区别与联系

     2 创建父工程

    3、创建基础模块  

    3.1 创建其他模块

    4订单微服务

     5、错误

    6、注册中心

    6.1 Nacos的使用

    6.2 将微服务注册到nacos

    6.2.1 将商品微服务注册到nacos

    6.2.2 将订单微服务注册到nacos中

    7、负载均衡

     7.1 自定义实现负载均衡

    7.2 Ribbon支持的负载均衡策略

    8、基于OpenFeign实现服务调用

    8.1 Feign的使用

     9、使用eureka作为注册中心


    1、 微服务的问题及一些解决方案

    1.1 HTTP的RESTful接口以及基于TCP的RPC协议 的区别与联系

     2 创建父工程

    (1)创建springboot

    (2)导入依赖

    1. 1.8
    2. UTF-8
    3. UTF- 8
    4. Hoxton.SR8
    5. 2.2.3.RELEASE
    6. org.springframework.cloud
    7. spring-cloud-dependencies
    8. ${spring-cloud.version}
    9. pom
    10. import
    11. com.alibaba.cloud
    12. spring-cloud-alibaba-dependencies
    13. ${spring-cloud-alibaba.version}
    14. pom
    15. import

     

    3、创建基础模块  

    (1) 创建 shop-common 模块,在pom.xml中添加依赖

     

     (2)依赖

    
        
            org.projectlombok
            lombok
        
        
            com.baomidou
            mybatis-plus-boot-starter
            3.5.1
        
    
    

    (3)创建实体类(在微服务中共用)

    3.1 创建其他模块

    (1)导入依赖(跟上面的创建一样)

    
        
        
            springcloud_parent
            com.wk
            0.0.1-SNAPSHOT
    
        
    
        
            org.springframework.boot
            spring-boot-starter-web
        
    
    
        
            mysql
            mysql-connector-java
        
       
    
    
    
    

     (2) 创建的主类

     (3)创建配置类

    4订单微服务

    (1)创建与上面过程一样

    (2)controller类

    1. package com.wk.order.controller;
    2. import com.wk.entity.Order;
    3. import com.wk.entity.Product;
    4. import com.wk.order.service.OrderService;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.web.bind.annotation.GetMapping;
    7. import org.springframework.web.bind.annotation.PathVariable;
    8. import org.springframework.web.bind.annotation.RequestMapping;
    9. import org.springframework.web.bind.annotation.RestController;
    10. import org.springframework.web.client.RestTemplate;
    11. @RestController
    12. @RequestMapping("order")
    13. public class OrederController {
    14. @Autowired
    15. private OrderService orderService;
    16. //该类默认没有交于spring管理----->
    17. @Autowired
    18. private RestTemplate restTemplate;
    19. @GetMapping("getBuy/{pid}/{num}")
    20. public String getBuy(@PathVariable Integer pid,@PathVariable Integer num){
    21. System.out.println("=====================采购=========================");
    22. Order order = new Order();
    23. order.setNumber(num);
    24. //用户的信息可以根据token从redis中获取用户信息
    25. order.setUid(1);
    26. order.setUsername("张三");
    27. //需要设置订单对象中商品的信息
    28. //商品操作都在商品微服务---订单微服务远程调用商品微服务即可拿到商品信息。远程调用:http协议的restFul风格调用适合微服务, 基于TCP协议的RPC调用适合SOA分布式
    29. //一定采用的为http协议: (1)自己写代码完成http调用【httpclient】微信支付 ---适合调用第三方网址。 (2)spring提高了一个工具类RestTemplate,该类也是基于http协议完成的调用
    30. Product product = restTemplate.getForObject("http://localhost:8081/product/getp/"+pid,Product.class);
    31. System.out.println("~~~~~~~~~~~~~远程查询的商品结果+================"+product);
    32. order.setPid(product.getPid());
    33. order.setPname(product.getPname());
    34. order.setPprice(product.getPprice());
    35. orderService.saveOrder(order);
    36. return "采购完成";
    37. }
    38. }

    (3)RestTemplate的配置

     5、错误

    Error:(3, 32) java: 程序包org.springframework.boot不存在
    Error:(4, 46) java: 程序包org.springframework.boot.autoconfigure不存在
    Error:(6, 2) java: 找不到符号
      符号: 类 SpringBootApplication
    Error:(10, 9) java: 找不到符号
      符号:   变量 SpringApplication
      位置: 类 com.wk.SpringcloudParent2Application

    (1)解决办法

    将父工程下的src删除,即可解决问题

    6、注册中心

    Zookeeper

    zookeeper是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式

    应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用

    配置项的管理等。

    Eureka 

    EurekaSpringcloud Netflix中的重要组件,主要作用就是做服务注册和发现。但是现在已经

     ,停更不停用。

    Consul

    Consul是基于GO语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现

    和配置管理的功能。Consul的功能都很实用,其中包括:服务注册/发现、健康检查、Key/Value

    存储、多数据中心和分布式一致性保证等特性。Consul本身只是一个二进制的可执行文件,所以

    安装和部署都非常简单,只需要从官网下载后,在执行对应的启动脚本即可。

    Nacos (服务治理  配置中心)

    Nacos是一个更易于构建云原生应用的动态服务发现配置管理服务管理平台。它是 Spring

    Cloud Alibaba 组件之一,负责服务注册发现服务配置,可以这样认为nacos=eureka+config

    6.1 Nacos的使用

    1: 安装nacos

    下载地址: https://github.com/alibaba/nacos/releases

    下载zip格式的安装包,然后进行解压缩操作

    2: 启动nacos

    #切换目录

    cd nacos/bin

    #命令启动

    startup.cmd -m standalone

     

     然后在命令提示符中输入启动命令

    第三步  访问nacos

    打开浏览器输入http://localhost:8848/nacos,即可访问服务, 默认密码是nacos/nacos

    6.2 将微服务注册到nacos

    1 在你要注册到nacos的微服务中的pom.xml中添加nacos的依赖

    6.2.1 将商品微服务注册到nacos

    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    dependency>

    2、在application.porperties添加nacos的配置

    #微服务的注册
    spring.cloud.nacos.discovery.server-addr=localhost:8848
    #wk-product是你为注册到nacos中起的微服务名字
    spring.application.name=shop-product

    3、 启动商品微服务

    这是注册成功后的显示

    判断是否将该服务注册到注册中心

     

     如果为true就不会注册

    6.2.2 将订单微服务注册到nacos中

    1 pom.xml中添加nacos的依赖

    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-alibaba-nacos-discoveryartifactId>
    dependency>

    2、在application.porperties添加nacos的配置

    #微服务的注册
    spring.cloud.nacos.discovery.server-addr=localhost:8848
    #判断是否件该服务注册到nacos中
    spring.cloud.nacos.discovery.register-enabled=false
    spring.application.name=wk-order

    3、对controller层的代码进行修改

    1. package com.wk.order.controller;
    2. import com.wk.entity.Order;
    3. import com.wk.entity.Product;
    4. import com.wk.order.fei.ProductFei;
    5. import com.wk.order.service.OrderService;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.cloud.client.ServiceInstance;
    8. import org.springframework.cloud.client.discovery.DiscoveryClient;
    9. import org.springframework.web.bind.annotation.GetMapping;
    10. import org.springframework.web.bind.annotation.PathVariable;
    11. import org.springframework.web.bind.annotation.RequestMapping;
    12. import org.springframework.web.bind.annotation.RestController;
    13. import org.springframework.web.client.RestTemplate;
    14. import java.util.List;
    15. import java.util.Random;
    16. @RestController
    17. @RequestMapping("order")
    18. public class OrederController {
    19. @Autowired
    20. private OrderService orderService;
    21. //该类默认没有交于spring管理----->
    22. @Autowired
    23. private RestTemplate restTemplate;
    24. @Autowired
    25. private DiscoveryClient discoveryClient;
    26. @GetMapping("getBuy/{pid}/{num}")
    27. public String getBuy(@PathVariable Integer pid,@PathVariable Integer num){
    28. System.out.println("=====================采购=========================");
    29. Order order = new Order();
    30. order.setNumber(num);
    31. //用户的信息可以根据token从redis中获取用户信息
    32. order.setUid(1);
    33. order.setUsername("张三");
    34. // //根据服务名获取对应的所有实例对象
    35. List instances = discoveryClient.getInstances("wk-product");
    36. //获取第一个实例对象
    37. ServiceInstance serviceInstance = instances.get(0);
    38. //获取实例对象的http+ip+port
    39. String path = serviceInstance.getUri().toString();
    40. //需要设置订单对象中商品的信息
    41. //商品操作都在商品微服务---订单微服务远程调用商品微服务即可拿到商品信息。远程调用:http协议的restFul风格调用适合微服务, 基于TCP协议的RPC调用适合SOA分布式
    42. //一定采用的为http协议: (1)自己写代码完成http调用【httpclient】微信支付 ---适合调用第三方网址。 (2)spring提高了一个工具类RestTemplate,该类也是基于http协议完成的调用
    43. Product product = restTemplate.getForObject(path+"/product/getp/"+pid,Product.class);
    44. System.out.println("~~~~~~~~~~~~~远程查询的商品结果+================"+product);
    45. order.setPid(product.getPid());
    46. order.setPname(product.getPname());
    47. order.setPprice(product.getPprice());
    48. orderService.saveOrder(order);
    49. return "采购完成";
    50. }
    51. }

    7、负载均衡

     7.1 自定义实现负载均衡

    1 通过idea再启动一个 shop-product 微服务,设置其端口为8082

    在RestTemplate上添加@LoadBalanced

     然后,只修改订单微服务中的controller中代码的一行,修改后的结果

    7.2 Ribbon支持的负载均衡策略

     随机选择一个server

    在订单微服务中的application.porperties添加

    #指定ribbon负载军衡器的策略:springcloud-product微服务名称.ribbon.NFLoadBalancerRuleClassName=负载均衡策略
    wk-product.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

    8、基于OpenFeign实现服务调用

    OpenFeignSpring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务一样简单, 只需要创建一个接口并添加一个注解即可。

    8.1 Feign的使用

    1 加入Fegin的依赖


    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-openfeignartifactId>
    dependency>

    2 在主启动类上加入开启feign的注解

    3 创建feign的接口

    4 修改OrderController的代码

    1. package com.wk.order.controller;
    2. import com.wk.entity.Order;
    3. import com.wk.entity.Product;
    4. import com.wk.order.fei.ProductFei;
    5. import com.wk.order.service.OrderService;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.cloud.client.ServiceInstance;
    8. import org.springframework.cloud.client.discovery.DiscoveryClient;
    9. import org.springframework.web.bind.annotation.GetMapping;
    10. import org.springframework.web.bind.annotation.PathVariable;
    11. import org.springframework.web.bind.annotation.RequestMapping;
    12. import org.springframework.web.bind.annotation.RestController;
    13. import org.springframework.web.client.RestTemplate;
    14. import java.util.List;
    15. import java.util.Random;
    16. @RestController
    17. @RequestMapping("order")
    18. public class OrederController {
    19. @Autowired
    20. private OrderService orderService;
    21. //该类默认没有交于spring管理----->
    22. @Autowired
    23. private RestTemplate restTemplate;
    24. @Autowired
    25. private DiscoveryClient discoveryClient;
    26. @Autowired(required = false)
    27. private ProductFei productFei;
    28. @GetMapping("getBuy/{pid}/{num}")
    29. public String getBuy(@PathVariable Integer pid,@PathVariable Integer num){
    30. System.out.println("=====================采购=========================");
    31. Order order = new Order();
    32. order.setNumber(num);
    33. //用户的信息可以根据token从redis中获取用户信息
    34. order.setUid(1);
    35. order.setUsername("张三");
    36. //获取商品的相关信息
    37. Product product = productFei.getProduct(pid);
    38. System.out.println("~~~~~~~~~~~~~远程查询的商品结果+================"+product);
    39. order.setPid(product.getPid());
    40. order.setPname(product.getPname());
    41. order.setPprice(product.getPprice());
    42. orderService.saveOrder(order);
    43. return "采购完成";
    44. }
    45. }

     9、使用eureka作为注册中心

    Eureka是Netflix开发的服务发现框架,SpringCloud将它集成在自己的子项目spring-cloud-netflix中,实现SpringCloud的服务发现功能。

    1. 创建一个eureka服务端

     2、applicaton.properties

    1. server.port=7001
    2. spring.application.name=eureka-server
    3. #实例的主机名
    4. eureka.instance.hostname=localhost
    5. #是否把eureka服务端注册到注册中心
    6. eureka.client.register-with-eureka=false
    7. #该服务是否从注册中心拉取服务
    8. eureka.client.fetch-registry=false
    9. # 提供类微服务的地址
    10. eureka.client.service-url.defaultZone=http://localhost:7001/eureka

     3、主启动类

    1. @SpringBootApplication
    2. @EnableEurekaServer
    3. public class EurekaApp {
    4. public static void main(String[] args) {
    5. SpringApplication.run(EurekaApp.class,args);
    6. }
    7. }

    客户端(商品微服务和订单微服务)

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
    dependency>

    配置文件 

    eureka.client.service-url.defaultZone=http://localhost:7001/eureka
    

  • 相关阅读:
    UI控件DevExpress WinForm新手指南——如何在应用启动时执行操作
    Linux命令——telnet
    C. Crossword Validation(字典树)
    面试:OkHttp相关
    软件测试需要学习什么?好学吗?需要学多久?到底是报班好还是自学好?
    HCIA-单臂路由-VLAN-VLAN间通信-OSPF 小型实验
    nodejs的express负载均衡(续)
    实用调试技巧
    CNM:MERGE INTO
    ThreadPoolExecutor源码分析
  • 原文地址:https://blog.csdn.net/younger123rtyui9/article/details/126408356