SpringCloud

SpringCloud

为什么要用为服务?这是一个面试官问我的问题;
我们传统的开发是将所有功能都集成在一个项目中,打成jar包或者war包上传至服务器;这样做的缺点就是系统太过笨重;就如同一个巨型机器人,体积太过庞大,而一旦一个部位出问题,整个系统就可能崩溃,耦合度太紧密;
而微服务就如同无数纳米机器人合成的一个巨型机器人,可修复性非常强;一个部分出错不会影响整个系统。
那么它是怎么实现的呢?

搭建SpringCloud项目

springcloud 的实现是将所有的服务都注册在一个主服务器上(当然也可以有好几台主服务器相互注册调用),然后通过该主服务器进行调配调用,每个服务器有不同的分工;分工明确,便于开发。(一个小组只负责一个服务端的开发即可)

  1. 首先新建一个maven的空项目;
    SpringCloud_第1张图片
    然后一路next最后finish
    这是建所有项目的父maven,其中的src文件夹我们可以不要,因为不在里边写Java代码;
    SpringCloud_第2张图片
  2. 创建主控制服务器并命名为eureka_server;
    右击主目录新建module
    SpringCloud_第3张图片
    新建SpringBoot项目
    SpringCloud_第4张图片
    后边就跟新建项目一样,只不过再选组件的时候要注意:创建主服务器(也就是我们现在创建的服务器,要选Eureka server),创建客户端服务器(也就是要在主服务器中注册而被调用的服务时要选Eureka Client);
    最终我们选中的如下图:
    SpringCloud_第5张图片

这样服务器就建好了;接下来需要在启动类上加上@EnableEurekaServer注解,开启Eureka服务;

  • 接下来对yaml配置文件进行配置:
#配置端口
server:
  port: 8888   
  
eureka:
  instance:
    hostname: eureka-server
  client:
    register-with-eureka: false
    fetch-registry: false 
    service-url:
      defaultZone: http://localhost:${server.port}/eureka/
spring:
  application:
    name: eurka-server

register-with-eureka表示是否在eureka服务器上注册,我们现在配置的就是服务器,所以设置为false(默认为true)fetch-registry也设置为false;
service-url设置该服务器的地址;spring.application.name设置主机名;
设置完毕之后,我们就可以启动项目了;启动后浏览器可访问eureka的启动界面;
访问地址:http://localhost:8888
我们可以看到如下界面:
SpringCloud_第6张图片
现在我们还没有创建client服务,所以application下什么都没有;
3. 接下来我们创建client服务器:
步骤跟上边差不多;唯一不同的是我们要选中eureka client
SpringCloud_第7张图片

  • 要配置为eurekaClient首先要在启动类上添加@EnableEurekaClient注解,启动eurekaClient服务;
    SpringCloud_第8张图片

  • yml配置文件的配置

spring:
  application:
    name: client01
eureka:
  client:
    service-url: 
      defaultZone: http://127.0.0.1:8888/eureka/
server:
  port: 8889

spring.application.name很重要,后边服务器的调配调用需要用到它
此处的serviceURL是要注册的服务器主机(也就是eurekaServer的地址)表示要本服务注册到的服务地址;
启动服务;我们的eurekaclient就注册完成了;
在http://localhost:8888 查看,就会发现已经注册的服务器:
SpringCloud_第9张图片
相同的步骤,我们需要用到两个服务器;
第二台服务器我们命名为client02,端口我们设置成9999;
创建好之后主服务器service的Eureka页面是这样的:
SpringCloud_第10张图片


服务器注册完之后,那么该如何进行服务器之间的访问
互通呢?

相互访问

首先当然是引入pom文件了;这里我们用的是FeignClient;pom依赖如下:

>
     >org.springframework.cloud>
     >spring-cloud-starter-openfeign> 
 >

feignClient的用法很简单;主要用于服务网之间的数据传输,并保持数据格式不变;

  1. 首先要在交互的两个服务器之中分别建立一样的操作实体类javaBean;(也可放入公共包中进行引入)
package com.example.eurekaclient.eurekaclient.entity;   /**
 * @ClassName UserInfo
 * @Author will
 * @Date 2019/10/30 11:24
 **/ public class UserInfo {
    private int userId;
 private String userName;
 private String userAddress;
 private int userAge;   public UserInfo() {
    }

    public UserInfo(int userId, String userName, String userAddress, int userAge) {
        this.userId = userId;
 this.userName = userName;
 this.userAddress = userAddress;
 this.userAge = userAge;
  }

    public int getUserId() {
        return userId;
  }

    public void setUserId(int userId) {
        this.userId = userId;
  }

    public String getUserName() {
        return userName;
  }

    public void setUserName(String userName) {
        this.userName = userName;
  }

    public String getUserAddress() {
        return userAddress;
  }

    public void setUserAddress(String userAddress) {
        this.userAddress = userAddress;
  }

    public int getUserAge() {
        return userAge;
  }

    public void setUserAge(int userAge) {
        this.userAge = userAge;
  }
}

SpringCloud_第11张图片
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yQSFCdQx-1572834724967)($resource/SpringCloud_第12张图片)]
该类必须要有默认的构造函数,即无参构造函数;否则传输过来之后feignClient会无将其法解析成为实体类
2. 在eurekaclient上创建controller,用于被访问:

@RestController
@RequestMapping("test")
public class mycontoller {
    @GetMapping("/eureka02")
    public List<UserInfo> getEureka(){
        System.out.println(" \n----------------This is Eureka02");
        List<UserInfo> list =new ArrayList<>();
        list.add(new UserInfo(1,"zhangsan","上海",12));
        list.add(new UserInfo(2,"lisi","江西",20));
        list.add(new UserInfo(3,"lilei","Ama",21));
       return list;
  }
}

这样当另一个服务器cloudclient访问 /test/eureka02时就会返回我们创建的三个用户;
3. 在cloudclient中创建接口,进行数据访问;
首先要在启动类上加上@EnableFeignClients:

@SpringBootApplication 
@EnableEurekaClient 
@EnableFeignClients 
public class Client02Application {

    public static void main(String[] args) {
        SpringApplication.run(Client02Application.class, args);
  }

}

然后创建访问接口,UserFeginClient接口;

@FeignClient("client01")
public interface UserFeginClient {
    @GetMapping("/test/all")
    List<UserInfo> getAllUsers(); 
}

这里的@FeignClient(“client01”)中的“client01”就是我们要访问的目标主机名;
4. 创建对外的访问Controller;

@RestController 
public class MainController {
    @Autowired
    private UserFeginClient userFeginClient;
    @GetMapping("/hi")
    public List<UserInfo> getAllUsers(){
        return userFeginClient.getAllUsers();
  }
}

至此,我们一个简单的分布式服务器就建完了;下来看一下测试:
访问地址http://localhost:9999/hi
数据测试


一般来说搭建微服务还需要配置网关,将自己的一些后台服务放置于内网中,向外只露出与用户直接交互的接口,这样更为安全;

你可能感兴趣的:(#,java学习笔记)