搭建springcloud项目——简单明了(三)

简介: 本文继续讲解搭建springcloud项目的过程。

接上文:搭建springcloud项目——简单明了(二)


UserServiceImpl类

42.png

@Service
@Transactional
public class UserServiceImpl implements UserService {
    //注入用户Mapper
    @Autowired
    private UserMapper userMapper;
    //查询所有用户
    public List<User> getAllUsers() {
        return this.userMapper.getAllUsers();
    }
    //删除用户
    public void deleteUser(Integer id) {
        System.out.println("删除了id为"+id+"的用户");
        this.userMapper.delete(id);
    }


UserService接口


public interface UserService {
    //查询所有
    List<User> getAllUsers();
    //删除数据
    void deleteUser(Integer id);
}


UserController类


43.png


@RestController
@RequestMapping("/user")
public class UserController {
    //注入用户Service
    @Autowired
    private UserService userService;
    //查询所有用户
    @RequestMapping("/userList")
    public List<User> getAllUsers(){
        List<User> list = this.userService.getAllUsers();
        return list;
    }
    //删除用户
    @RequestMapping("/delete/{id}")
    public void delete(@PathVariable Integer id){
        this.userService.deleteUser(id);
    }


然后检查eureka-user的Controller


44.png


然后按顺序分别启动eureka-server、eureka-order、eureka-user


然后访问:http://localhost:8000/findOrdersByUser/1


如图


45.png


这样就证明访问成功了


Ribbon



Ribbon是用来实现负载均衡的


首先我们在eureka-user中Application的@Bean下加注解@LoadBalanced

,加了这个注解后RestTemplate就具有了负载均衡能力。


46.png


然后将eureka-user中的UserController进行如下修改


47.png


我们将之前的“主机地址+端口号”变成了实例名称


在order中写一个工具类


48.png


@Configuration
public class ServiceInfoUtil implements ApplicationListener<EmbeddedServletContainerInitializedEvent> {
    /**
     * 声明event对象,该对象用于获取运行服务器的本地端口
     */
    private static EmbeddedServletContainerInitializedEvent event;
    public void onApplicationEvent(
            EmbeddedServletContainerInitializedEvent event){
        ServiceInfoUtil.event = event;
    }
    /**
     * 获取端口号
     */
    public static int getPort(){
        int port = event.getEmbeddedServletContainer().getPort();
        return port;
    }


然后在userList接口中写一个输出,这是用来输出端口号


49.png


然后将eureka-order先启动一次,再把端口号该为7901再启动一次


50.png


可以看到启动了两个order服务


然后我们访问http://localhost:8000/findOrdersByUser/1


52.png


我们多访问几次,然后看输出


53.png


54.png


我们可以看到,这两个不同端口的order都访问到了,证明Ribbon实现了负载均衡机制。


eureka-user-hystrix



接下来我们写hystrix模块,简单了来说就是熔断器模块,因为在系统中例如c服务调用b服务,然后b服务调用a服务,假如a服务出现问题,那么会导致b服务出现问题,然后再导致c服务出现问题,最终整个系统全部瘫痪,为了解决这个问题就出现了熔断器。


1、新建eureka-user-hystrix模块,步骤和上面的其他模块一样,pom.xml中添加如下配置。


55.png


 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <!--Hystrix依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
        </dependency>


yml文件如下


57.png


server:
  port: 8030
eureka:
  instance:
    prefer-ip-address: true
  client:
    service-rul:
      defaultZone: http://localhost:8761/eureka/
spring:
  application:
    name: eureka-user-hystrix


新建启动类


58.png


@SpringBootApplication
@EnableCircuitBreaker
@EnableEurekaClient
public class Application {
  public static void main(String [] args){
    SpringApplication.run(Application.class, args);
  }
  @Bean
  @LoadBalanced
  public RestTemplate restTemplate(){
    return new RestTemplate();
  }
}


新建UserController,代码中的fallbackInfo方法就是在指定的服务出现问题不能访问的时候就会走这个方法,当指定的服务问题解决以后又会自动再访问指定的访问,这里是自动熔断与连接的。


59.png


@RestController
public class UserController {
    @Autowired
    private RestTemplate restTemplate;
    /**
     * 查找与用户相关的订单
     */
    @GetMapping("/findOrdersByUser/{id}")
    @HystrixCommand(fallbackMethod = "fallbackInfo")
    public String findOrdersByUser(@PathVariable String id){
        return this.restTemplate.getForObject("http://eureka-order/user/userList", String.class);
    }
    /**
     * 返回信息方法
     */
     public String fallbackInfo(@PathVariable String id){
         return "服务不可用,请稍后再试!";
     }
}


现在我们来依次启动项目,order启动两个,分别为7900和7901


启动后访问http://localhost:8761/ 如下图证明启动成功


60.png


然后访问http://localhost:8030/findOrdersByUser/1 如下图


61.png


然后我们就多访问几次,发现访问正常,而且负载也正常


62.png


63.png


这个时候我们停掉7901的服务


然后我们再次刷新之前的路径,当负载到7901的接口的时候出现下图证明成功


64.png


然后我们再启动7901服务后,再次访问就不会出现上图情况,证明我们熔断器配置成功。


gateway-zuul



接下来我们创建zuul(网关)模块,网关可以用来执行认证、动态路由、安全和动态响应等功能,这里主要讲一下动态路由。


新建gateway-zuul,pom.xml配置如下


65.png


<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>


yml配置如图


66.png


新建启动类


67.png


@EnableZuulProxy
@SpringBootApplication
@EnableEurekaClient
public class Application {
  public static void main(String [] args){
    SpringApplication.run(Application.class, args);
  }
}


然后我们依次启动注册中心(eureka-server)、服务提供者(eureka-order)、网关服务(gateway-zuul)


然后我们访问 http://localhost:7900/order/1


出现下图证明成功


70.png


config-server



接下来我们创建配置模块,因为我们以后可能随着业务越来越大,我们会从单体系统升级为分布式系统,但是我们每一个模块都有一个配置文件,这样我们要修改一个模块的配置文件,就需要找到该模块的所有文件,一个一个修改。









相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
19小时前
|
监控 安全 Java
Spring cloud原理详解
Spring cloud原理详解
7 0
|
5天前
|
XML Java 数据格式
Spring 项目如何使用AOP
Spring 项目如何使用AOP
18 2
|
5天前
|
Java Spring
Spring boot项目如何发送邮件
Spring boot项目如何发送邮件
14 2
|
5天前
|
消息中间件 负载均衡 Java
【Spring Cloud 初探幽】
【Spring Cloud 初探幽】
13 1
|
6天前
|
Java 开发者 微服务
Spring Cloud原理详解
【5月更文挑战第4天】Spring Cloud是Spring生态系统中的微服务框架,包含配置管理、服务发现、断路器、API网关等工具,简化分布式系统开发。核心组件如Eureka(服务发现)、Config Server(配置中心)、Ribbon(负载均衡)、Hystrix(断路器)、Zuul(API网关)等。本文讨论了Spring Cloud的基本概念、核心组件、常见问题及解决策略,并提供代码示例,帮助开发者更好地理解和实践微服务架构。此外,还涵盖了服务通信方式、安全性、性能优化、自动化部署、服务网格和无服务器架构的融合等话题,揭示了微服务架构的未来趋势。
31 6
|
11天前
|
Java Spring
IDEA 创建 SpringCloud项目-多项目方式
IDEA 创建 SpringCloud项目-多项目方式
|
11天前
|
JSON Java Apache
Spring Cloud Feign 使用Apache的HTTP Client替换Feign原生httpclient
Spring Cloud Feign 使用Apache的HTTP Client替换Feign原生httpclient
|
11天前
|
Java API 数据安全/隐私保护
【亮剑】如何在Java项目中结合Spring框架实现邮件发送功能
【4月更文挑战第30天】本文介绍了如何在Java项目中结合Spring框架实现邮件发送功能。首先,需在`pom.xml`添加Spring和JavaMail依赖。然后,在`applicationContext.xml`配置邮件发送器,包括SMTP服务器信息。接着,创建一个使用依赖注入的`EmailService`类,通过`JavaMailSender`发送邮件。最后,调用`EmailService`的`sendSimpleEmail`方法即可发送邮件。最佳实践包括:使用配置管理敏感信息,利用`MimeMessage`构造复杂邮件,异常处理和日志记录,以及在大量发送时考虑使用邮件队列。
|
11天前
|
负载均衡 Java 开发者
Spring Cloud:一文读懂其原理与架构
Spring Cloud 是一套微服务解决方案,它整合了Netflix公司的多个开源框架,简化了分布式系统开发。Spring Cloud 提供了服务注册与发现、配置中心、消息总线、负载均衡、熔断机制等工具,让开发者可以快速地构建一些常见的微服务架构。