public static boolean isBasicInfoChanged(Member actual, Member expected) {
        if (null == expected) {
            return null != actual;
        }
        if (!expected.getIp().equals(actual.getIp())) {
            return true;
        }
        if (expected.getPort() != actual.getPort()) {
            return true;
        }
        if (!expected.getAddress().equals(actual.getAddress())) {
            return true;
        }
        if (!expected.getState().equals(actual.getState())) {
            return true;
        }
    
        // if change
        if (expected.isGrpcReportEnabled() != actual.isGrpcReportEnabled()) {
            return true;
        }
        
        return isBasicInfoChangedInExtendInfo(expected, actual);
    }
@Test
    void testIsBasicInfoChangedNoChangeWithExtendInfo() {
        Member newMember = buildMember();
        newMember.setExtendVal("test", "test");
        assertFalse(MemberUtil.isBasicInfoChanged(newMember, originalMember));
    }