hooyantsing's Blog

第132次课程_微服务架构案例T3L3

字数统计: 869阅读时长: 3 min
2020/03/25

源辰76班

第132次课程

2020.03.25

内容

微服务架构案例T3L3[廖彦]

项目路径:****G:\YC74\200322_微服务架构案例T1L1\code

1.ModelAndView对象

可以存储数据之外,还可以转发页面。

1
2
3
4
5
6
7
8
9
@GetMapping({ "/", "index", "index.html" })
public ModelAndView index(ModelAndView mav) {
       mav.addObject("pclist",pca.getPc());
       //存数据
       mav.addObject("newslist",pca.getNews());
       //转发页面
       mav.setViewName("Index");
       return mav;
}

*2.***@ModelAttribute注解 **

如果每个页面都有用数据库数据来展示的动态部分,可以放在这个注解下的方法内,每次执行xxxAction都会首先调用这个方法内的代码。

1
2
3
4
@ModelAttribute
public void init() {
    //more code
}

3.页面根据是否登录来展示不同字段

html

1
2
3
4
5
6
7
8
<span class="fl">你好,
<!--未登录-->
<span th:if="${session.loginedUser} == null">
请<a href="tologin">登录</a>&nbsp;
</span>
<!--已登录-->
<span th:if="${session.loginedUser} != null"  th:text="${session.loginedUser.username}">            
</span>

4.Zuul网关补充

将Zuul模块设置为80端口。当访问127.0.0.1/index时Zuul会根据自身模块的application.yml找到ebuy-index业务模块,再根据ebuy-index在Eureka服务内注册的服务器的地址(127.0.0.1:8000/8003),找到IndexAction内的@GetMapping(“index”)对应的方法,并返回。

b1f7003ed2e779feed608eef2f46e3e9.png

5.[重点]session共享

解决问题:浏览器向服务器发送请求,哪个服务器受理请求,哪个服务器创建session,默认情况下不共享。当再次发送请求时,如果分配给了其他服务器受理,那么没有session对象,造成登录丢失现象。

解决思路:使用redis作为中间临时session数据库,让集群各个服务器之间共享session数据。

Zuul前提说明:由于zuul的敏感头,默认会自动拦截cookie,而cookie正是浏览器和服务端传递session的桥梁。因此需要关闭zuul的敏感头。

zuul模块下的application.yml加入以下配置:

1
2
3
4
5
6
7
#zuul网关
zuul:
   routes:
      ebuy-index:
         path: /**
         #过滤敏感头
         sensitiveHeaders:

第一步

业务模块加入以下依赖。

1
2
3
4
5
6
7
8
9
10
           <!-- spring集成redis 数据库依赖 -->
           <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
           </dependency>
           <!-- spring基于redis 共享会话依赖 -->
           <dependency>
                <groupId>org.springframework.session</groupId>
                <artifactId>spring-session-data-redis</artifactId>
           </dependency>

第二步

业务模块启动类加入**@EnableRedisHttpSession**注解。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.yc.ebuy;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@SpringBootApplication
//MyBatis 接口组件扫描
@MapperScan("com.yc.ebuy")
//开启声明式远程调用
@EnableFeignClients
//服务熔断降级开关
@EnableCircuitBreaker
//spring会话共享注解
@EnableRedisHttpSession
public class EbuyIndexAppcation {
    public static void main(String[] args) {
        SpringApplication.run(EbuyIndexAppcation.class, args);
    }
}

第三步

序列化实体类(bean)对象。

1
2
3
4
5
6
7
8
9
10
11
12
public class EasybuyUser implements Serializable{
    /**
      * 转存redis数据库,需要序列号对象
      */
    private static final long serialVersionUID = 1L;
    private Integer id;
    private String loginname;
    private String username;

    //more code ...

}

注意:

启动项目时,需要手动开启redis

9c3b9d1299df64a7d4eed81259f520d5.png

可以通过命令来查看数据库数据

1
keys *

bc85e38ea399a48aaad27acec15616d2.png

7.出现服务器连接超时/拒绝连接问题

解决方案

zuul模块内加入以下配置:

1
2
3
4
#hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 60000
#ribbon:
#  ConnectTimeout: 3000
#  ReadTimeout: 60000

8.easybuy项目启动顺序

c0bfbae052fb99730c62d1870d447cff.png

CATALOG