微服务架构

1 认识微服务

1.1 架构演变

1)单体架构

所有功能集中在一个项目中开发,打成一个包部署。

2)分布式架构

将不同的功能进行拆分,每个功能作为不同的独立项目进行开发,称为一个服务。

微服务架构_第1张图片

3)微服务

微服务是一种经过良好架构设计的分布式架构方案,微服务架构特征:

  • 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发
  • 面向服务: 微服务对外暴露业务接口
  • 自治: 团队独立、技术独立、数据独立、部署独立
  • 隔离性强: 服务调用做好隔离、容错、降级,避免出现级联问题

微服务架构_第2张图片

1.2 微服务架构

微服务架构_第3张图片

注意:微服务架构也是分布式架构,微服务拆的更彻底,更细粒度 ,去中心化

在SpringCloud还未出现之际,蚂蚁金服内部就已经有了一套比较完整的金融级分布式架构Sofa

1)Sofa

Sofa将应用系统拆分为多个模块(bundle),各个模块之间各司其职,负责独立的业务,模块之间通过JVM/RPC接口调用。

2)SpringCloud

SpringCloud将应用系统拆分为多个微服务,模块之间通过RPC/HTTP方式进行调用。

微服务架构_第4张图片

微服务架构_第5张图片

2 SpringCloud

2.1 注册中心

1)创建父工程



    4.0.0

    com.lmlsj
    lmspringcloud
    pom
    1.0-SNAPSHOT
    
        eurekaserver
        ServiceProvider
        entityclass
        serviceconsumer
        gateway
    

    
        org.springframework.boot
        spring-boot-starter-parent
        2.1.2.RELEASE
    

    
        
            org.springframework.boot
            spring-boot-starter-web
        
        
        
            org.projectlombok
            lombok
            1.18.20
            provided
        
    

    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                Greenwich.SR3
                pom
                import
            
        
    

2)父工程下创建注册中心

(1)pom文件

微服务架构_第6张图片

(2)配置文件

微服务架构_第7张图片

server:
  port: 8761
eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://localhost:8761/eureka/

(3)创建启动类

微服务架构_第8张图片

(4)启动查看注册中心 

微服务架构_第9张图片

3)服务提供者

(1)基础配置

微服务架构_第10张图片

微服务架构_第11张图片

启动后注册到注册中心去 

(2)单独创建一个student服务实例

微服务架构_第12张图片

(3)完善服务提供者内容

微服务架构_第13张图片

StudentRepositoryImpl.java

@Repository
public class StudentRepositoryImpl implements StudentRepository {

    private static Map studentMap;

    //暂时在这里初始化student
    static {
        studentMap = new HashMap<>();
        studentMap.put(1L,new Student(1L,"add",20));
        studentMap.put(2L,new Student(2L,"delete",22));
        studentMap.put(3L,new Student(3L,"update",24));
        studentMap.put(4L,new Student(4L,"search",20));
    }

    @Override
    public Collection findAll() {
        return studentMap.values();
    }

    @Override
    public Student findById(long id) {
        return studentMap.get(id);
    }

    @Override
    public void saveOrUpdate(Student student) {
        studentMap.put(student.getId(),student);
    }

    @Override
    public void deleteById(long id) {
        studentMap.remove(id);
    }
}

StudentHandler.java

@RestController
@RequestMapping(value = "/stu")
public class StudentHandler {
    @Autowired
    private StudentRepository studentRepository;

    @GetMapping("/list")
    public Collection findAll(){
        return studentRepository.findAll();
    }

    @GetMapping("/findById/{id}")
    public Student findById(@PathVariable("id") long id){
        return studentRepository.findById(id);
    }

    @PostMapping("/save")
    public void save(@RequestBody Student student){
        studentRepository.saveOrUpdate(student);
    }

    @GetMapping("/update")
    public void update(@RequestBody Student student){
        studentRepository.saveOrUpdate(student);
    }

    @GetMapping("/deleteById/{id}")
    public void deleteById(@PathVariable("id") long id){
        studentRepository.deleteById(id);
    }

}

(3)运行访问

微服务架构_第14张图片

4)服务消费者

(1)基础配置

微服务架构_第15张图片

微服务架构_第16张图片

(2)消费类

@RestController
@RequestMapping("/stuconsumer")
public class StuConsumerHandler {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/findAll")
    public Collection findAll(){
        return restTemplate.getForObject("http://localhost:8010/stu/list",Collection.class);
    }

    @GetMapping("/findAll2")
    public Collection findAll2(){
        return restTemplate.getForEntity("http://localhost:8010/stu/list",Collection.class).getBody();
    }

    @GetMapping("/findById/{id}")
    public Student findById(@PathVariable("id") long id){
        return restTemplate.getForEntity("http://localhost:8010/stu/findById/{id}",Student.class,id).getBody();
    }

    @GetMapping("/findById2/{id}")
    public Student findById2(@PathVariable("id") long id){
        return restTemplate.getForObject("http://localhost:8010/stu/findById/{id}",Student.class,id);
    }

    @PostMapping("/save")
    public void save(@RequestBody Student student){
        restTemplate.postForEntity("http://localhost:8010/stu/save",student,null).getBody();
    }

    @PostMapping("/save2")
    public void save2(@RequestBody Student student){
        restTemplate.postForObject("http://localhost:8010/stu/save",student,null);
    }
}

 (3)运行测试

微服务架构_第17张图片

2.2 服务网关—ZUUL

1)POM文件



    
        lmspringcloud
        com.lmlsj
        1.0-SNAPSHOT
    
    4.0.0

    gateway

    
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
            2.0.2.RELEASE
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-zuul
            2.0.2.RELEASE
        
    

2)配置文件

server:
  port: 8088
spring:
  application:
    name: CloudGateway
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
zuul:
  routes:
    StuProivder: /api/p/**

3)启动文件

微服务架构_第18张图片

4)结果

微服务架构_第19张图片

2.3 负载均衡—Ribbon

Spring Cloud Ribbon 是一套基于 Netflix Ribbon 实现的客户端负载均衡和服务调用工具。

微服务架构_第20张图片

1)基本配置

微服务架构_第21张图片

微服务架构_第22张图片

2)启动类

微服务架构_第23张图片

3)测试

(1)服务提供类新增一个方法

微服务架构_第24张图片

 (2)创建两个启动类

微服务架构_第25张图片

分别修改port为不同的端口启动

(3)ribbon负载均衡测试

微服务架构_第26张图片

微服务架构_第27张图片

2.4 Feign

Feign是声明式的web service客户端,整合了Ribbon和Hystrix。

在使用Ribbon + RestTemplate时,利用RestTemplate对Http请求的封装处理,形成了一套模板化的调用方法。Feign在此基础上做了进一步的封装,简化此类操作。

你可能感兴趣的:(JavaWeb,架构,微服务,java)